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

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;

...hims056の提案は、通常、適切なインデックスが存在する場合にパフォーマンスが向上すると思います。

3 番目の解決策は次のとおりです。

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 に答える