如何在PostgreSQL中按类别select最大date组的ID?
举个例子,我想selectid与最大date组,按类别,结果是:7,2,6
id category date 1 a 2013-01-01 2 b 2013-01-03 3 c 2013-01-02 4 a 2013-01-02 5 b 2013-01-02 6 c 2013-01-03 7 a 2013-01-03 8 b 2013-01-01 9 c 2013-01-01
我可以知道如何在PostgreSQL中做到这一点?
对于DISTINCT ON
(标准DISTINCT
Postgres特定扩展),这是一个完美的用例:
SELECT DISTINCT ON (category) id FROM tbl ORDER BY category, "date" DESC;
小心降序sorting。 如果该列可以为NULL,则可能需要添加NULLS LAST
:
- PostgreSQL按datetime ascsorting,先是null?
DISTINCT ON
最简单快捷。 这个相关答案的详细解释:
- 在每个GROUP BY组中select第一行?
对于大餐桌考虑这个替代方法:
- 优化分组最大查询
每个category
许多行的性能优化:
- 优化GROUP BY查询以检索每个用户的最新logging
试试这个:
SELECT * FROM Table1 t1 JOIN ( SELECT category, MAX(date) AS MAXDATE FROM Table1 GROUP BY category ) t2 ON T1.category = t2.category AND t1.date = t2.MAXDATE
看到这个SQLFiddle
另一种方法是使用first_value
窗口函数: http : first_value
SELECT DISTINCT first_value("id") OVER (PARTITION BY "category" ORDER BY "date" DESC) FROM Table1 ORDER BY 1;
…虽然我怀疑他的build议通常会在适当的指数存在的情况下performance更好。
第三个解决scheme是:
SELECT id FROM ( SELECT id, row_number() OVER (PARTITION BY "category" ORDER BY "date" DESC) AS rownum FROM Table1 ) x WHERE rownum = 1;
SELECT id FROM tbl GROUP BY cat HAVING MAX(date)