根据上次日期选择记录

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)

这个相关答案的细节:


Max*_*sky 7

SELECT "ID", "Course Name", MAX("Course Date") FROM "Course" GROUP BY "ID", "Course Name"
Run Code Online (Sandbox Code Playgroud)

  • 只要没有额外的列,这种方法就可以正常工作。 (2认同)

小智 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 子句中。