Sql

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;