如何在 PostgreSQL 中按类别选择具有最大日期组的 id?
Posted
技术标签:
【中文标题】如何在 PostgreSQL 中按类别选择具有最大日期组的 id?【英文标题】:How to select id with max date group by category in PostgreSQL? 【发布时间】:2013-05-30 15:05:08 【问题描述】:例如,我想按类别选择具有最大日期组的 id, 结果是: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 中执行此操作吗?
【问题讨论】:
【参考方案1】:这是 DISTINCT ON
的完美用例 - 标准 DISTINCT
的 Postgres 特定扩展:
SELECT DISTINCT ON (category)
id -- , category, date -- any other column (expression) from the same row
FROM tbl
ORDER BY category, date DESC;
小心降序排列。如果该列可以为NULL,您可能需要添加NULLS LAST
:
DISTINCT ON
简单快捷。此相关答案中的详细说明:
对于每个 category
有很多行的大表,请考虑另一种方法:
【讨论】:
看起来不错,但您确定每次都能保证有效吗? @Tixel:当然。点击链接了解更多详情。【参考方案2】:试试这个:
SELECT t1.* 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
见this SQLFiddle
【讨论】:
还有另一个选项使用 rank() 窗口函数。 @user1735921:您将从 Table1 中获取所有列。你可以选择任何你想要的。【参考方案3】:另一种方法是使用first_value
窗口函数:http://sqlfiddle.com/#!12/7a145/14
SELECT DISTINCT
first_value("id") OVER (PARTITION BY "category" ORDER BY "date" DESC)
FROM Table1
ORDER BY 1;
...虽然我怀疑 hiss056 的建议通常会在存在适当索引的情况下表现更好。
第三种解决方案是:
SELECT
id
FROM (
SELECT
id,
row_number() OVER (PARTITION BY "category" ORDER BY "date" DESC) AS rownum
FROM Table1
) x
WHERE rownum = 1;
【讨论】:
以上是关于如何在 PostgreSQL 中按类别选择具有最大日期组的 id?的主要内容,如果未能解决你的问题,请参考以下文章