您好,我有一张包含这些列的表格
ID(每新行增加 1)、人员、会议日期
我正在使用此查询为每个人选择最后一次会议
SELECT Person, MAX(MeetingDate) FROM MyTable
GROUP BY Person
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得每个人最后一次会议的 ID?
谢谢
J.D*_*.D. 14
您可以使用窗口函数(例如调用的排名函数)在每个按降序排列ROW_NUMBER()
的分组 ( ) 内生成数字系列,如下所示:PARTITION
Person
MeetingDate
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
中不同的结果被执行。MeetingDate
Person
例如,如果A 中有两行,其中MyTable
10/25/2021 ,一行为1,另一行为2,则仅对该字段进行排序是不确定的,因为对于同一. 换句话说,当排序的值完全相同时,哪一行排在第一位?实际上,不可能将一个排序在另一个之前,但在 SQL Server 中,答案是它是随机的。Person
MeetingDate
ID
ID
MeetingDate
MeetingDate
Person
要纠正这个问题,您需要确保通过唯一的表达式进行排序。如果您的ID
列保证是这样,那么在您有两行具有相同的相同 的UNIQUE
情况下,您还可以将 添加到窗口函数的 order by 子句的末尾,以确保您始终获得确定性结果。如果您想要最大的(通常是最新的 - 取决于您生成它们的方式)值,当有两行相同时,您将按字段降序排序。MeetingDate
Person
ID
ID
Person
MeetingDate
ID
以下是使用上面的 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 次 |
最近记录: |