我有一个包含id
、year
和count
的表格。
我想获取每个 id
的 MAX(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)
,它只是按原样显示表格。我想是因为当按 year
和 id
分组时,它会获得该特定年份的 id
的最大值。
那么,我该如何编写该查询?我想获取 id
的 MAX(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/