PostgreSQL中的计数问题

时间:2012-05-04 12:16:46

标签: postgresql count group-by

我想要一列的计数,我在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中删除该列以便我可以获得正确的计数?

1 个答案:

答案 0 :(得分:3)

重新阅读问题后更新。
您正在混合GROUP BYDISTINCT 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之后的版本。

这里发生了什么?

  1. d_ct中计算(a,b,c)中有多少相同的d集合,其中包含a的非空值。
  2. ORDER BY选择一行。如果您a不仅仅ORDER BY,则会选择随机行。
  3. 在我的示例中,我d_ct DESC d_ct,因此将挑选出具有最高GROUP BY的集合中的伪随机行。

  4. 使用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 ONe之前应用,因此结果与上面的结果非常相似,只有min_e / {{1}}的值是不同的。