101

例如,我想按类别选择具有最大日期组的 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 中执行此操作吗?

4

3 回答 3

165

这是一个完美的用例DISTINCT ON——标准的 Postgres 特定扩展DISTINCT

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考虑另一种方法:

于 2013-06-04T14:09:59.637 回答
22

试试这个:

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

看到这个 SQLFiddle

于 2013-06-04T09:25:24.700 回答
16

另一种方法是使用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;
于 2013-06-04T12:29:17.267 回答