【发布时间】:2015-05-02 09:59:29
【问题描述】:
我使用的是 PostgreSQL 9.4,我有一个包含 1300 万行的表,数据大致如下:
a | b | u | t
-----+---+----+----
foo | 1 | 1 | 10
foo | 1 | 2 | 11
foo | 1 | 2 | 11
foo | 2 | 4 | 1
foo | 3 | 5 | 2
bar | 1 | 6 | 2
bar | 2 | 7 | 2
bar | 2 | 8 | 3
bar | 3 | 9 | 4
bar | 4 | 10 | 5
bar | 5 | 11 | 6
baz | 1 | 12 | 1
baz | 1 | 13 | 2
baz | 1 | 13 | 2
baz | 1 | 13 | 3
md5(a)、b 和 (md5(a), b) 上有索引。 (实际上,a 可能包含超过 4k 个字符的值。)还有一个 SERIAL 类型的主键列,我在上面省略了。
我正在尝试构建一个将返回以下结果的查询:
a | b | u | t | z
-----+---+----+----+---
foo | 1 | 1 | 10 | 3
foo | 1 | 2 | 11 | 3
foo | 2 | 4 | 1 | 3
foo | 3 | 5 | 2 | 3
bar | 1 | 6 | 2 | 5
bar | 2 | 7 | 2 | 5
bar | 2 | 8 | 3 | 5
bar | 3 | 9 | 4 | 5
bar | 4 | 10 | 5 | 5
bar | 5 | 11 | 6 | 5
在这些结果中,所有行都被删除重复数据,就像应用了 GROUP BY a, b, u, t 一样,z 是 b 的每个分区的不同值的计数 a,并且只有 z 值更大的行超过 2 个。
我可以让z 过滤器按如下方式工作:
SELECT a, COUNT(b) AS z from (SELECT DISTINCT a, b FROM t) AS foo GROUP BY a
HAVING COUNT(b) > 2;
但是,我很难将它与表中的其余数据结合起来。
最有效的方法是什么?
【问题讨论】:
标签: sql postgresql count distinct aggregate-functions