我想要一列的计数,我在FROM子句中有5列但由于我已经包含了from子句中的所有列,所以它给出了错误的计数。我不希望在GROUP BY子句中使用该特定列。
如果我从GROUP BY子句中删除该列,则会抛出以下错误:
错误:列“pt.name”必须出现在GROUP BY子句中或使用 在一个聚合函数LINE 1:SELECT distinct on(pu.id)pu.id, pt.name as package_name,c ...
E.g:
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中删除该列以便我可以获得正确的计数?
答案 0 :(得分:3)
重新阅读问题后更新。
您正在混合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
DISTINCT ON
在 e
之前应用,因此结果与上面的结果非常相似,只有min_e
/ {{1}}的值是不同的。