32

根据下表Course

在此处输入图像描述

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

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

在此处输入图像描述

如果我在 Course 表中有两个日期列,它们是 StartDate 和 EndDate 并且我想仅基于 EndDate 显示相同的列。?

我正在使用 PostgreSQL。

4

5 回答 5

43

在 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;

此相关答案中的详细信息:

于 2013-09-26T12:22:34.117 回答
7
SELECT "ID", "Course Name", MAX("Course Date") FROM "Course" GROUP BY "ID", "Course Name"
于 2013-09-26T12:13:27.530 回答
6
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 子句中。

于 2013-09-26T12:32:09.727 回答
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;
于 2013-09-26T12:37:59.093 回答
-1
SELECT * 
FROM  course
GROUP BY id,course name
order by course_date desc
于 2013-09-26T12:21:32.527 回答