我在Postgres数据库中有一个名为Course的表:
Course
如何选择课程名称最新日期的行?我的意思是,如果一个ID有两个相同的课程名称,我应该只显示最新的一个,如下面的结果。简单地说,我只想显示每个(“ID”,“Course Name”)的最新行。
如果我在表Course中有两个日期列,分别是StartDate和EndDate,并且我想仅基于EndDate显示相同的数据,该怎么办?
StartDate
EndDate
r1zk6ea11#
在PostgreSQL中,要获得 * 一组定义的列的唯一行 *,更好的方法通常是DISTINCT ON:
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")的唯一行:
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;
对于每组 * 许多 * 行,有更快的查询技术。
eulz3vhy2#
SELECT "ID", "Course Name", MAX("Course Date") FROM "Course" GROUP BY "ID", "Course Name"
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子句会限制可以返回的列。
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;
mftmpeh85#
SELECT * FROM course GROUP BY id,course name order by course_date desc
5条答案
按热度按时间r1zk6ea11#
在PostgreSQL中,要获得 * 一组定义的列的唯一行 *,更好的方法通常是
DISTINCT ON
:假设您实际上使用了带有空格的不幸的大写标识符。
这样,每个
ID
可以得到 * 正好一行 *--如果日期上有平局,则是最新已知的"Course Date"
和第一个"Course Name"
(根据排序顺序)。如果列定义为
NOT NULL
,则可以删除NULLS LAST
。要获取每个
("ID", "Course Name")
的唯一行:对于每组 * 许多 * 行,有更快的查询技术。
eulz3vhy2#
myss37ts3#
这里MAX()OVER(PARTITION BY)允许您在派生表中查找每个课程(分区)的最大CourseDate,然后您可以只选择CourseDate等于该课程的最大CourseDate的行。
这种方法的优点是不使用GROUP BY子句,因为SELECT子句中的任何非聚合列也必须在GROUP BY子句中,所以GROUP BY子句会限制可以返回的列。
wwtsj6pe4#
试试这个:
mftmpeh85#