postgresql 根据上次日期选择行

bprjcwpo  于 2022-12-23  发布在  PostgreSQL
关注(0)|答案(5)|浏览(131)

我在Postgres数据库中有一个名为Course的表:

如何选择课程名称最新日期的行?我的意思是,如果一个ID有两个相同的课程名称,我应该只显示最新的一个,如下面的结果。
简单地说,我只想显示每个(“ID”,“Course Name”)的最新行。

如果我在表Course中有两个日期列,分别是StartDateEndDate,并且我想仅基于EndDate显示相同的数据,该怎么办?

r1zk6ea1

r1zk6ea11#

在PostgreSQL中,要获得 * 一组定义的列的唯一行 *,更好的方法通常是DISTINCT ON

SELECT DISTINCT ON ("ID") *
FROM   "Course"
ORDER  BY "ID", "Course Date" DESC NULLS LAST, "Course Name";

假设您实际上使用了带有空格的不幸的大写标识符。
这样,每个ID可以得到 * 正好一行 *--如果日期上有平局,则是最新已知的"Course Date"和第一个"Course Name"(根据排序顺序)。
如果列定义为NOT NULL,则可以删除NULLS LAST
要获取每个("ID", "Course Name")的唯一行:

SELECT DISTINCT ON ("ID", "Course Name") *
FROM   "Course"
ORDER  BY "ID", "Course Name", "Course Date" DESC NULLS LAST;

对于每组 * 许多 * 行,有更快的查询技术。

  • 是否选择每个GROUP BY组中的第一行?
eulz3vhy

eulz3vhy2#

SELECT "ID", "Course Name", MAX("Course Date") FROM "Course" GROUP BY "ID", "Course Name"
myss37ts

myss37ts3#

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子句中,所以GROUP BY子句会限制可以返回的列。

wwtsj6pe

wwtsj6pe4#

试试这个:

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

mftmpeh85#

SELECT * 
FROM  course
GROUP BY id,course name
order by course_date desc

相关问题