PostgreSQLでカテゴリ別に最大日付グループのIDを選択するにはどうすればよいですか?
How Select Id With Max Date Group Category Postgresql
解決:
これは、 区別する
-標準のPostgres固有の拡張明確:
SELECT DISTINCT ON(カテゴリ)id-、category、date-同じ行の他の列(式)FROM tbl ORDER BYカテゴリ、日付DESC;ソート順の降順に注意してください。列がNULLになる可能性がある場合は、追加することをお勧めします最後のNULL:
- 列ASCで並べ替えますが、最初にNULL値ですか?
DISTINCTONはシンプルで高速です。この関連する回答の詳細な説明:
- 各GROUPBYグループの最初の行を選択しますか?
あたりの行数が多い大きなテーブルの場合カテゴリは別のアプローチを検討します。
- GROUP BYクエリを最適化して、ユーザーごとに最新の行を取得します
- グループごとの最大クエリを最適化する
これを試してください:
SELECTt1。* 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を参照してください
別のアプローチは、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;