postgresql - PostgreSQL 中的计数问题

标签 postgresql count group-by

我想要一列的计数,并且我在 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 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 的非空值>。
  2. 为每个 a 选择一行。如果您不 ORDER BY 而不仅仅是 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 before DISTINCT ON 应用,所以结果与上面的非常相似,只有 的值e/min_e 是不同的。

关于postgresql - PostgreSQL 中的计数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10448675/

相关文章:

sql - 如何在 SQL 中获取唯一值?

sql - 在 PL/pgSQL 中执行此查询的更好方法

sql - 使用 coalesce 改进 postgres 子查询

c - 在C中,使用while循环来计算用户输入的字符数

php - 如何使用 PHP 显示提交的单选按钮值的计数

python - 确定每个组在另一列中具有相同值的大小

mysql - sql group by value within char(255) 字段的子字符串

mysql - GROUP BY mysql中的两个字段

postgresql - Postgres备份并覆盖一张表

python - 错误 : pg_config executable not found when installing psycopg2 on Alpine in Docker