如何解决如何计算组数?
我有一张桌子,如下:
glibc
我想计算不同的id g_n val_name
---------------------
1 a "a"
2 a "aa"
3 b "123"
4 b "asad"
5 c "aas1"
的数量。 (这里是g_n
。)
我尝试过:
3
但是它给了我每个组的项目数。
我如何计算不同 select count(*)
from table_t
group by g_n
的数量?
解决方法
使用return ($jobs->due_out == null) ? 'N/A' : date(self::DATETIME,strtotime($jobs->due_out));
:
count(distinct)
对于此结果,无需使用select count(distinct g_n)
from table_t;
进行汇总。
注意:这将忽略group by
值。如果您也要计算它们,则:
NULL
,
这还会计算g_n
中的NULL值(如果有则加1):
SELECT count(*) -- count(*) counts *all* rows
FROM (SELECT DISTINCT ON (g_n) FROM tbl) sub;
子查询中的SELECT
列表可以保留为空,因为外部count(*)
中的SELECT
始终不考虑行值,仅计算行数(这是它比count(expression)
。
它通常也比聚合表达式中的DISTINCT
子句快:
SELECT count(DISTINCT g_n) -- count(expression) ignores NULL values
FROM tbl;
但是要在大表中获得少量独特g_n
的快速计数,请模拟索引跳过扫描。基本索引可以完成这项工作:
CREATE INDEX ON tbl (g_n);
然后:
WITH RECURSIVE t AS (
(SELECT g_n FROM tbl ORDER BY 1 LIMIT 1)
UNION ALL
SELECT (SELECT g_n FROM tbl WHERE g_n > t.g_n ORDER BY 1 LIMIT 1)
FROM t
WHERE t.col IS NOT NULL
)
SELECT count(g_n) FROM t; -- ignores NULL
要还计算可能的NULL,请有条件地添加1:
...
SELECT count(g_n) + CASE WHEN EXISTS(SELECT FROM tbl WHERE g_n IS NULL) THEN 1 ELSE 0 END
FROM t;
同样,大表的CASE
和EXISTS
表达式要比Gordon演示的max((g_n is null)::int)
聚合要快得多。
请参阅:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。