0

我想要一列的计数,我在 FROM 子句中有 5 列,但它给出了错误的计数,因为我已经包含了 from 子句中的所有列。我不希望 GROUP BY 子句中的特定列。

如果我从 GROUP BY 子句中删除该列,则会引发以下错误:

错误:列“pt.name”必须出现在 GROUP BY 子句中或用于聚合函数第 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 中删除该列以便获得正确的计数?

4

1 回答 1

3

重读问题后更新。
你正在混合GROUP BYDISTINCT ON。你想要的(我是怎么理解的)可以通过一个窗口函数和一个结合来完成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
  2. 每个 . 准确选择一行a。如果您不ORDER BY超过 just a,则会选择随机行。
  3. 在我的示例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不同。

于 2012-05-04T13:35:49.027 回答