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

Sort by column ASC, but NULL values first?

DISTINCT ON 简单快捷。此相关答案中的详细说明:

Select first row in each GROUP BY group?

对于每个 category 有很多行的大表,请考虑另一种方法:

Optimize GROUP BY query to retrieve latest row per user Optimize groupwise maximum query

【讨论】:

看起来不错,但您确定每次都能保证有效吗? @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?的主要内容,如果未能解决你的问题,请参考以下文章

如何为postgresql中的每个用户返回具有最大值的类别?

在 HTMX 中按类别从项目列表中获取 ID

如何在 Maven 中按类别运行 JUnit 测试?

在 PostgreSQL 中按字母顺序搜索朋友

如何在Postgres中按年月按最大(日期)组获取行?

在 Power BI 中按类别选择前三个价格点