Aan*_*Aan 17 sql database postgresql greatest-n-per-group
根据Course下面的表格:

如何选择具有最新日期的课程名称的记录?我的意思是如果我有一个ID的两个相同的课程名称,我应该只显示最新的一个作为下面的结果.
简单地说,我只想显示最新的每行("ID","课程名称").

如果我在Course表中有两个日期列,即StartDate和EndDate,我想仅基于EndDate显示相同的内容.
我正在使用PostgreSQL.
Erw*_*ter 29
在PostgreSQL中,为了获得一组已定义的列的唯一行,优选的技术通常是DISTINCT ON:
SELECT DISTINCT ON ("ID") *
FROM "Course"
ORDER BY "ID", "Course Date" DESC NULLS LAST, "Course Name";
Run Code Online (Sandbox Code Playgroud)
假设您实际使用带有空格的那些不幸的大写标识符.
你得到的具体哪一行每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;
Run Code Online (Sandbox Code Playgroud)
这个相关答案的细节:
SELECT "ID", "Course Name", MAX("Course Date") FROM "Course" GROUP BY "ID", "Course Name"
Run Code Online (Sandbox Code Playgroud)
小智 6
SELECT *
FROM (SELECT ID, CourseName, CourseDate,
MAX(CourseDate) OVER (PARTITION BY COURSENAME) as MaxCourseDate
FROM Course) x
WHERE CourseDate = MaxCourseDate
Run Code Online (Sandbox Code Playgroud)
在这里,MAX() OVER(PARTITION BY) 允许您在派生表中找到每个课程(分区)的最高课程日期。然后,您只需选择 CourseDate 等于为该课程找到的最大 Coursedate 的行。
这种方法的好处是不使用 GROUP BY 子句,这会限制您可以返回的列,因为 SELECT 子句中的任何非聚合列也必须在 GROUP BY 子句中。