以下のCourse
というテーブルに基づく:
コース名が最新の日付のレコードを選択するにはどうすればよいですか?つまり、1つのIDに2つの同じコース名がある場合、以下の結果として最新のもののみを表示する必要があります。
簡単に言うと、(「ID」、「コース名」)ごとに最新の行のみを表示します。
そして、コーステーブルにStartDateとEndDateの2つの日付列があり、EndDateのみに基づいて同じように表示したい場合はどうなりますか?
PostgreSQLを使用しています。
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;
_
この関連回答の詳細:
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句に含める必要があるため、返すことができる列が制限されます。
SELECT "ID", "Course Name", MAX("Course Date") FROM "Course" GROUP BY "ID", "Course Name"
これを試して:
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;