postgresql日期加減




如何在PostgreSQL中按類別選擇最大日期ID? (3)

SELECT id FROM tbl GROUP BY cat HAVING MAX(date)

舉個例子,我想按類別選擇帶有最大日期組的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中知道如何做到這一點嗎?


另一種方法是使用first_value窗口函數: http://sqlfiddle.com/#!12/7a145/14first_value

SELECT DISTINCT
  first_value("id") OVER (PARTITION BY "category" ORDER BY "date" DESC) 
FROM Table1
ORDER BY 1;

...雖然我懷疑他的建議通常會在適當的索引存在的情況下表現得更好。

第三種解決方案是:

SELECT
  id
FROM (
  SELECT
    id,
    row_number() OVER (PARTITION BY "category" ORDER BY "date" DESC) AS rownum
  FROM Table1
) x
WHERE rownum = 1;

這是DISTINCT ON的完美用例(Postgres標準DISTINCT特定擴展):

SELECT DISTINCT ON (category)
       id  -- , category, date -- add any other column (expression) from the same row
FROM   tbl
ORDER  BY category, "date" DESC;

小心降序排序。 如果列可以為NULL,則可能需要添加NULLS LAST

DISTINCT ON最簡單快速。 這個相關答案的詳細解釋:

對於大表,考慮這種替代方法:

每個category 許多行的性能優化:





greatest-n-per-group