web-dev-qa-db-ja.com

最終日に基づいてレコードを選択します

以下のCourseというテーブルに基づく:

enter image description here

コース名が最新の日付のレコードを選択するにはどうすればよいですか?つまり、1つのIDに2つの同じコース名がある場合、以下の結果として最新のもののみを表示する必要があります。

簡単に言うと、(「ID」、「コース名」)ごとに最新の行のみを表示します。

enter image description here

そして、コーステーブルにStartDateとEndDateの2つの日付列があり、EndDateのみに基づいて同じように表示したい場合はどうなりますか?

PostgreSQLを使用しています。

18
Aan

PostgreSQLでは、定義された列のセットの一意の行を取得するために、一般的に推奨される手法は _DISTINCT ON_ です。

_SELECT DISTINCT ON ("ID") *
FROM   "Course"
ORDER  BY "ID", "Course Date" DESC NULLS LAST, "Course Name";
_

あなたが実際にそれらの残念な大文字の識別子をスペースで使用すると仮定します。

あなたは正確に1つの行IDごとにこのように-最新の既知の_"Course Date"_と最初の_"Course Name"_(ソート順による)日付で結びます。

列が_NULLS LAST_で定義されている場合、_NOT NULL_を削除できます。

_("ID", "Course Name")_ごとに一意の行を取得するには:

_SELECT DISTINCT ON ("ID", "Course Name") *
FROM   "Course"
ORDER  BY "ID", "Course Name", "Course Date" DESC NULLS LAST;
_

この関連回答の詳細:

26
SELECT *
FROM (SELECT ID, CourseName, CourseDate, 
      MAX(CourseDate) OVER (PARTITION BY COURSENAME) as MaxCourseDate
FROM Course) x
WHERE CourseDate = MaxCourseDate

ここでMAX()OVER(PARTITION BY)を使用すると、派生テーブルで各コース(パーティション)の最高のCourseDateを見つけることができます。次に、CourseDateがそのコースで見つかった最大のCoursedateと等しい行を選択するだけです。

この方法にはGROUP BY句を使用しないという利点があります。SELECT句の非集計列もGROUP BY句に含める必要があるため、返すことができる列が制限されます。

4
GVIrish
SELECT "ID", "Course Name", MAX("Course Date") FROM "Course" GROUP BY "ID", "Course Name"
4

これを試して:

SELECT DISTINCT ON (c."Id", c."Course Name") 
    c."Id", c."Course Name", c."Course Date" 
FROM (SELECT * FROM "Course" ORDER BY "Course Date" DESC) c;
0
Minoru