获取具有最大日期的记录的行 ID

Dan*_*Dan 6 sql-server

您好,我有一张包含这些列的表格

ID(每新行增加 1)、人员、会议日期

我正在使用此查询为每个人选择最后一次会议

SELECT Person, MAX(MeetingDate) FROM MyTable
GROUP BY Person
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得每个人最后一次会议的 ID?

谢谢

J.D*_*.D. 14

您可以使用窗口函数(例如调用的排名函数)在每个按降序排列ROW_NUMBER()的分组 ( ) 内生成数字系列,如下所示:PARTITIONPersonMeetingDate

SELECT ID, Person, MeetingDate
FROM
(
    SELECT
        ID,
        Person,
        MeetingDate,
        ROW_NUMBER() OVER (PARTITION BY Person ORDER BY MeetingDate DESC) AS SortId
    FROM MyTable
) AS Subquery
WHERE SortId = 1
Run Code Online (Sandbox Code Playgroud)

如果您愿意,还可以使用公用表表达式 (CTE)而不是子查询来整理内容:

WITH CTE_MyTable_Sorted AS
(
    SELECT
        ID,
        Person,
        MeetingDate,
        ROW_NUMBER() OVER (PARTITION BY Person ORDER BY MeetingDate DESC) AS SortId
    FROM MyTable
)

SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
Run Code Online (Sandbox Code Playgroud)

使用子查询和 CTE 之间的区别主要在于组织/可读性方面的偏好,但如果您需要将多个子查询链接在一起以执行其他数据操作(而不是多个级别的子查询),则 CTE 对于保持代码整洁很有用。


请注意,bbaird 做了一个非常公平的评论,如果您遇到相同的情况Person有两个不同的行具有相同的精确性,MeetingDate那么我之前的上面的查询是不确定的,并且每次查询时都可能返回与该相同和分组ID中不同的结果被执行。MeetingDatePerson

例如,如果A 中有两行,其中MyTable10/25/2021 ,一行为1,另一行为2,则仅对该字段进行排序是不确定的,因为对于同一. 换句话说,当排序的值完全相同时,哪一行排在第一位?实际上,不可能将一个排序在另一个之前,但在 SQL Server 中,答案是它是随机的PersonMeetingDateIDIDMeetingDateMeetingDatePerson

要纠正这个问题,您需要确保通过唯一的表达式进行排序。如果您的ID列保证是这样,那么在您有两行具有相同的相同 的UNIQUE情况下,您还可以将 添加到窗口函数的 order by 子句的末尾,以确保您始终获得确定性结果。如果您想要最大的(通常是最新的 - 取决于您生成它们的方式)值,当有两行相同时,您将按字段降序排序。MeetingDatePersonIDIDPersonMeetingDateID

以下是使用上面的 CTE 实现的示例:

WITH CTE_MyTable_Sorted AS
(
    SELECT
        ID,
        Person,
        MeetingDate,
        ROW_NUMBER() OVER (PARTITION BY Person ORDER BY MeetingDate DESC, ID DESC) AS SortId
    FROM MyTable
)

SELECT ID, Person, MeetingDate
FROM CTE_MyTable_Sorted
WHERE SortId = 1
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

37269 次

最近记录:

3 年,11 月 前