我想要一列的计数,并且我在 FROM 子句中有 5 列,但它给出了错误的计数,因为我已经包含了 from 子句中的所有列。我不想要 GROUP BY 子句中的特定列。
如果我从 GROUP BY 子句中删除该列,它会抛出以下错误:
ERROR: column "pt.name" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT distinct on (pu.id) pu.id, pt.name as package_name, c...
例如:
SELECT DISTINCT ON (a) a,b,c,count(d),e
FROM table GROUP BY a,b,c,d,e ORDER BY a
由此我想从 GROUP BY 中删除 e。
如何从 GROUP BY 中删除该列以便获得正确的计数?
最佳答案
重读问题后更新。
您正在混合使用 GROUP BY
和 DISTINCT ON
。你想要的(我是怎么理解的)可以用 window function 来完成结合DISTINCT ON
:
SELECT DISTINCT ON (a)
a, b, c
, count(d) OVER (PARTITION BY a, b, c) AS d_ct
, e
FROM tbl
ORDER BY a, d_ct DESC;
窗口函数需要 PostgreSQL 8.4 或更高版本。
这里发生了什么?
- 在
d_ct
中计算表中有多少相同的(a,b,c)
集合,d
的非空值>。 - 为每个
a
选择一行。如果您不ORDER BY
而不仅仅是a
,则会选择随机行。 - 在我的示例中,我还
ORDER BY
d_ct DESC
,因此具有最高d_ct
的集合中的伪随机行将被选中。
对您可能需要的内容的另一种略有不同的解释,使用 GROUP BY
:
SELECT DISTINCT ON (a)
a, b, c
, count(d) AS d_ct
, min(e) AS min_e -- aggregate e in some way
FROM t
GROUP BY a, b, c
ORDER BY a, d_ct DESC;
GROUP BY
before DISTINCT ON
应用,所以结果与上面的非常相似,只有 的值e
/min_e
是不同的。
关于postgresql - PostgreSQL 中的计数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10448675/