根据下表Course
:
如何选择课程名称和日期最近的记录?我的意思是,如果我的一个 ID 有两个相同的课程名称,我应该只显示最新的一个作为下面的结果。
简单地说,我只想显示每个(“ID”,“课程名称”)的最新行。
如果我在 Course 表中有两个日期列,它们是 StartDate 和 EndDate 并且我想仅基于 EndDate 显示相同的列。?
我正在使用 PostgreSQL。
根据下表Course
:
如何选择课程名称和日期最近的记录?我的意思是,如果我的一个 ID 有两个相同的课程名称,我应该只显示最新的一个作为下面的结果。
简单地说,我只想显示每个(“ID”,“课程名称”)的最新行。
如果我在 Course 表中有两个日期列,它们是 StartDate 和 EndDate 并且我想仅基于 EndDate 显示相同的列。?
我正在使用 PostgreSQL。
在 PostgreSQL 中,要为一组定义的列获取唯一行,优选的技术通常是DISTINCT ON
:
SELECT DISTINCT ON ("ID") *
FROM "Course"
ORDER BY "ID", "Course Date" DESC NULLS LAST, "Course Name";
假设您实际上使用带有空格的那些不幸的大写标识符。
通过这种方式,您可以得到准确的一行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 "ID", "Course Name", MAX("Course Date") FROM "Course" GROUP BY "ID", "Course Name"
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 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;
SELECT *
FROM course
GROUP BY id,course name
order by course_date desc