基于以下名为Course
的表格:
如何选择课程名称为最新日期的记录?我的意思是如果我有一个ID的两个相同的课程名称,我应该只显示最新的一个作为以下结果。
简单地说,我只想显示最新的每行(“ID”,“课程名称”)。
如果我在课程表中有两个日期列,那就是StartDate& EndDate和我想仅基于EndDate显示相同的内容。?
我正在使用PostgreSQL。
答案 0 :(得分:21)
在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;
此相关答案的详细信息:
答案 1 :(得分:4)
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子句中。
答案 2 :(得分:3)
SELECT "ID", "Course Name", MAX("Course Date") FROM "Course" GROUP BY "ID", "Course Name"
答案 3 :(得分:0)
试试这个:
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;
答案 4 :(得分:-1)
SELECT *
FROM course
GROUP BY id,course name
order by course_date desc