根据上次日期选择记录

时间:2013-09-26 12:09:59

标签: sql database postgresql greatest-n-per-group

基于以下名为Course的表格:

enter image description here

如何选择课程名称为最新日期的记录?我的意思是如果我有一个ID的两个相同的课程名称,我应该只显示最新的一个作为以下结果。

简单地说,我只想显示最新的每行(“ID”,“课程名称”)。

enter image description here

如果我在课程表中有两个日期列,那就是StartDate& EndDate和我想仅基于EndDate显示相同的内容。?

我正在使用PostgreSQL。

5 个答案:

答案 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