如何在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)