标签: count

Postgres Count 在同一个查询中具有不同的条件

编辑Postgres 9.3

我正在处理具有以下架构的报告:http : //sqlfiddle.com/#!15/fd104/2

当前查询工作正常,如下所示:

在此处输入图片说明

基本上它是一个 3 表内连接。我没有做这个查询,而是离开它的开发人员,我想修改查询。如您所见,TotalApplication只计算基于a.agent_id. 您可以totalapplication在结果中看到该列。我想要的是删除它并将其更改totalapplication为新的两列。我想添加一个completedsurveypartitalsurvey列。所以基本上这部分会变成

SELECT a.agent_id as agent_id, COUNT(a.id) as CompletedSurvey
FROM forms a WHERE  a.created_at >= '2015-08-01' AND 
a.created_at <= '2015-08-31' AND disposition = 'Completed Survey'
GROUP BY a.agent_id
Run Code Online (Sandbox Code Playgroud)

我刚刚添加AND disposition = 'Completed Survey'但我需要另一列partialsurvey具有相同的查询,completedsurvey唯一的区别是

AND disposition = 'Partial Survey'
Run Code Online (Sandbox Code Playgroud)

COUNT(a.id) as PartialSurvey
Run Code Online (Sandbox Code Playgroud)

但我不知道该把查询放在哪里,也不知道查询会是什么样子。所以最终输出有这些列

agent_id, name, completedsurvey, partialsurvey, loginhours, applicationperhour, rph
Run Code Online (Sandbox Code Playgroud)

一旦确定,然后 applicationperhour …

postgresql join count postgresql-9.3 aggregate-filter

72
推荐指数
1
解决办法
8万
查看次数

select count(*) 和 select count(any_non_null_column) 有什么区别?

我似乎记得(在 Oracle 上) utteringselect count(*) from any_tableselect count(any_non_null_column) from any_table.

如果有的话,这两个陈述之间有什么区别?

null oracle aggregate count

60
推荐指数
3
解决办法
4万
查看次数

MySQL为表中的每条记录计算另一个表中的行数

SELECT
  student.StudentID,
  student.`Name`,
  COUNT(attendance.AttendanceID) AS Total
FROM
  student
LEFT JOIN attendance ON student.StudentID = attendance.StudentID
Run Code Online (Sandbox Code Playgroud)

我正在尝试计算最后一行,但它计算所有结果并返回一个结果

我得到了类似的东西

在此处输入图片说明

因为有多个记录,因为 K1052280 的出勤 ID 中有两个条目,所以我想计算这些条目并返回数字。就像是

在此处输入图片说明

mysql count select

30
推荐指数
1
解决办法
11万
查看次数

在大型 PostgresSQL 表中提高 COUNT/GROUP-BY 的性能?

我正在运行 PostgresSQL 9.2 并且有一个 12 列的关系,大约有 6,700,000 行。它包含 3D 空间中的节点,每个节点都引用一个用户(创建它的人)。要查询哪个用户创建了多少个节点,我执行以下操作(添加explain analyze以获取更多信息):

EXPLAIN ANALYZE SELECT user_id, count(user_id) FROM treenode WHERE project_id=1 GROUP BY user_id;
                                                    QUERY PLAN                                                         
---------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=253668.70..253669.07 rows=37 width=8) (actual time=1747.620..1747.623 rows=38 loops=1)
   ->  Seq Scan on treenode  (cost=0.00..220278.79 rows=6677983 width=8) (actual time=0.019..886.803 rows=6677983 loops=1)
         Filter: (project_id = 1)
 Total runtime: 1747.653 ms
Run Code Online (Sandbox Code Playgroud)

如您所见,这大约需要 1.7 秒。考虑到数据量,这还算不错,但我想知道这是否可以改进。我尝试在用户列上添加 BTree 索引,但这没有任何帮助。

您有其他建议吗?


为了完整起见,这是完整的表定义及其所有索引(没有外键约束、引用和触发器):

    Column     |           Type           |                      Modifiers                    
---------------+--------------------------+------------------------------------------------------
 id            | bigint                   | not null default nextval('concept_id_seq'::regclass)
 user_id       | bigint …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index count group-by

28
推荐指数
2
解决办法
6万
查看次数

MySQL - 使用 count(*) 和 information_schema.tables 计算行数的区别

我想要一种快速的方法来计算我的表中有几百万行的行数。我在 Stack Overflow 上找到了帖子“ MySQL:计算行数的最快方法”,看起来它可以解决我的问题。Bayuah提供了这个答案:

SELECT
    table_rows "Rows Count"
FROM
    information_schema.tables
WHERE
    table_name="Table_Name"
AND
    table_schema="Database_Name";
Run Code Online (Sandbox Code Playgroud)

我喜欢它,因为它看起来像查找而不是扫描,所以它应该很快,但我决定对其进行测试

SELECT COUNT(*) FROM table 
Run Code Online (Sandbox Code Playgroud)

看看有多大的性能差异。

不幸的是,我得到了不同的答案,如下所示:

在此处输入图片说明

为什么答案相差大约 200 万行?我猜执行全表扫描的查询是更准确的数字,但是有没有一种方法可以获得正确的数字而不必运行这个慢查询?


我跑了ANALYZE TABLE data_302,它在 0.05 秒内完成。当我再次运行查询时,我现在得到了 34384599 行的更接近的结果,但它仍然select count(*)与 34906061 行的数字不同。分析表是否立即返回并在后台处理?我觉得值得一提的是,这是一个测试数据库,目前尚未写入。

没有人会关心是否只是告诉某人表有多大,但我想将行数传递给一些代码,这些代码将使用该数字创建一个“同等大小”的异步查询来查询数据库并行,类似于Alexander Rubin 通过并行查询执行提高慢查询性能中显示的方法。事实上,我将获得最高的 id,SELECT id from table_name order by id DESC limit 1并希望我的表不会变得过于分散。

mysql count mysql-5.6

26
推荐指数
1
解决办法
3万
查看次数

如果列存在,如何选择特定行,如果列不存在,如何选择所有行

我正在编写一个脚本来获取几个表的行数,但是对于某些表,我只想获取设置了标志的行数(在这种情况下为 active=1)。有没有一种方法可以在一个查询中做到这一点?

例如:

users有一个名为 active 的列

clients没有名为 active 的列

我想获取 active=1 的用户数,并获取客户端数。

在你说“只是硬编码它”之前,这是一个在 python 脚本中的查询,该脚本可以在许多不同的数据库上运行,我无法知道我的脚本将选择哪些表,以及它们是否有一个名为 的列active,以及我宁愿只用一个查询来完成所有工作,而不是两个单独的查询并依靠 mysql 抛出错误,所以我知道使用另一个查询。

mysql count select

24
推荐指数
1
解决办法
2万
查看次数

从 count() 确定百分比没有转换问题

我正在尝试运行以下查询以提供patients表中具有refinst列值的行的百分比。我一直得到0的结果。

select (count (refinst) / (select count(*) from patients) * 100) as "Formula" 
from patients;
Run Code Online (Sandbox Code Playgroud)

该表有 15556 行,并select count(refinst) from patients告诉我其中 1446行在列中有值refinst。我想从查询中得到的响应是 30.62 ( 1446/15556*100=30.62XXXXX,四舍五入到两位小数)。

我很确定它与计数结果的数据类型(我假设是整数)有关。如果我将一个整数除以一个整数并且结果小于 0,它会被截断为 0 是否正确?如果是这种情况,有人可以告诉我如何将计数结果转换为带有 2 个小数位的数字,以便结果也四舍五入到 2 个小数位吗?

我确信有比多个 count 语句更好的方法来编写此代码。我正在寻找一种更高效的方式来编写这个查询。

postgresql datatypes count cast

22
推荐指数
2
解决办法
4万
查看次数

为什么 count(*) 很慢,什么时候解释知道答案?

这个查询:select count(*) from planner_event需要很长时间才能运行 - 太长了,我在它完成之前放弃并杀死了它。但是,当我运行时explain select count(*) from planner_event,我可以在输出中看到一列带有行数 (14m)。

为什么explain可以立即得到行数,而count(*)却需要很长时间才能运行?

mysql count explain

22
推荐指数
2
解决办法
2万
查看次数

为什么 InnoDB 不存储行数?

每个人都知道,在使用 InnoDB 作为引擎的表中,诸如此类SELECT COUNT(*) FROM mytable的查询非常不准确且非常慢,尤其是当表变大并且在该查询执行时不断插入/删除行时。

据我了解,InnoDB 不会将行数存储在内部变量中,这就是导致此问题的原因。

我的问题是:为什么会这样?存储这样的信息有那么难吗?在许多情况下,这是一个重要的信息。我看到是否要实现这样的内部计数的唯一困难是当涉及事务时:如果事务未提交,您是否计算它插入的行数?

PS:我不是数据库方面的专家,我只是一个将 MySQL 作为一个简单爱好的人。因此,如果我只是问一些愚蠢的问题,请不要过分挑剔:D。

mysql innodb count

21
推荐指数
2
解决办法
8181
查看次数

计算一行中两列或更多列超过某个值的位置 [篮球、双双、三双]

我玩了一场篮球比赛,它允许将其统计数据输出为数据库文件,因此可以从中计算出游戏中未实现的统计数据。到目前为止,我在计算我想要的统计数据时没有遇到任何问题,但现在我遇到了一个问题:从他的比赛统计数据中计算一个球员在整个赛季中取得的双打和/或三双的数量。

双双和三双的定义如下:

双双:

两双是指球员在一场比赛中在五个统计类别中的两个类别(得分、篮板、助攻、抢断和盖帽)中累积达到两位数的总和的表现。

三双:

三双被定义为球员在一场比赛中在五个统计类别中的三个——得分、篮板、助攻、抢断和盖帽——中累计达到两位数的表现。

四双(添加澄清)

四双被定义为球员在一场比赛中在五个统计类别中的四个类别(得分、篮板、助攻、抢断和盖帽)中累计达到两位数的表现。

“PlayerGameStats”表存储玩家玩的每个游戏的统计数据,如下所示:

CREATE TABLE PlayerGameStats AS SELECT * FROM ( VALUES
  ( 1, 1,  1, 'Nuggets',    'Cavaliers',  6,  8,  2, 2,  0 ),
  ( 2, 1,  2, 'Nuggets',     'Clippers', 15,  7,  0, 1,  3 ),
  ( 3, 1,  6, 'Nuggets', 'Trailblazers', 11, 11,  1, 2,  1 ),
  ( 4, 1, 10, 'Nuggets',    'Mavericks',  8, 10,  2, 2, 12 ),
  ( 5, 1, 11, 'Nuggets',       'Knicks', 23, 12,  1, 0,  0 ),
  ( …
Run Code Online (Sandbox Code Playgroud)

mysql postgresql count group-by

20
推荐指数
4
解决办法
4642
查看次数