sql - PostgreSQL MAX 和 GROUP BY

标签 sql postgresql group-by max greatest-n-per-group

我有一个包含idyearcount 的表格。

我想获取每个 idMAX(count) 并在它发生时保留 year,所以我进行以下查询:

SELECT id, year, MAX(count)
FROM table
GROUP BY id;

不幸的是,它给了我一个错误:

ERROR: column "table.year" must appear in the GROUP BY clause or be used in an aggregate function

所以我尝试:

SELECT id, year, MAX(count)
FROM table
GROUP BY id, year;

但是,它不会执行 MAX(count),它只是按原样显示表格。我想是因为当按 yearid 分组时,它会获得该特定年份的 id 的最大值。

那么,我该如何编写该查询?我想获取 idMAX(count) 以及发生这种情况的年份。

最佳答案

最短(也可能是最快)的查询是 DISTINCT ON ,SQL 标准 DISTINCT 子句的 PostgreSQL 扩展:

SELECT DISTINCT ON (1)
       id, count, year
FROM   tbl
ORDER  BY 1, 2 DESC, 3;

数字指的是 SELECT 列表中的顺序位置。为清楚起见,您可以拼出列名:

SELECT DISTINCT ON (id)
       id, count, year
FROM   tbl
ORDER  BY id, count DESC, year;

结果按 id 等排序,可能受欢迎也可能不受欢迎。在任何情况下都比“未定义”好。

它还以明确定义的方式打破平局(当多个年份共享相同的最大计数时):选择最早的年份。如果您不在乎,请从 ORDER BY 中删除 year。或者使用 year DESC 选择最近的年份。

对于每个 id 许多 行,其他查询技术(快得多)。见:

关于sql - PostgreSQL MAX 和 GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13325583/

相关文章:

mysql - Microsoft Access 和 MYSQL 数据类型比较

MySQL 查询需要很长时间

sql - 识别在时间范围内是否没有足够的资源

mysql - 在 MySQL 中有条件地加入

SQL如何计算一组的相对值?

sql - 如何从按一列分组的 MySQL 表中选择行,并在另一列中选择所需值

mysql - 使用 hibernate 时合并两个查询

postgresql - 带引号的 NULL 值使 PostgreSQL COPY 命令失败

postgresql - 优化同一命令的多次执行 - Docker

group-by - groupby 并在 pyspark 中加入 vs 窗口