SQL Server 2012中用DISTINCT/GROUP BY获取最新CreatedOn的公共数据
解决SQL Server 2012中获取每个日期分组最新CreatedOn记录的问题
我懂你现在的困扰:原查询用DISTINCT能得到去重的TargetDate2,但加上ORDER BY CreatedOn DESC后就返回了所有日期记录——这是因为DISTINCT会对所有选中列的组合进行去重,当你引入CreatedOn(哪怕只是用于排序),查询逻辑会保留所有TargetDate2+TargetDate+CreatedOn的唯一组合,自然没法只保留每个日期分组的最新记录。
针对SQL Server 2012,最靠谱的方案是用窗口函数ROW_NUMBER(),它能帮我们按指定分组(这里是TargetDate2)给每条记录编号,再筛选出每个分组内最新(CreatedOn DESC)的那条记录。
具体实现语句
WITH RankedLogs AS ( SELECT CONVERT(VARCHAR(15), TargetDate, 106) AS TargetDate2, TargetDate, CreatedOn, -- 按格式化后的TargetDate2分组,每组内按CreatedOn降序编号,最新记录行号为1 ROW_NUMBER() OVER (PARTITION BY CONVERT(VARCHAR(15), TargetDate, 106) ORDER BY CreatedOn DESC) AS RowNum FROM LogsObservRequestActivity WHERE ActivityID = 170 AND TargetDate IS NOT NULL AND ISNULL(TargetDate, '') <> ISNULL(TargetDateOriginal, '') ) SELECT TargetDate2, TargetDate FROM RankedLogs WHERE RowNum = 1 ORDER BY TargetDate2 DESC; -- 可选,按需调整排序方式
逻辑说明
- CTE部分:先为每条记录计算
RowNum,PARTITION BY指定按格式化后的TargetDate2分组,ORDER BY CreatedOn DESC确保每个分组内最新的记录排在最前面,行号标记为1。 - 主查询:只筛选行号为1的记录,这样就得到了每个
TargetDate2对应的最新CreatedOn的那条记录,同时保留了你需要的TargetDate2和TargetDate字段。
如果不需要显示CreatedOn,主查询里直接排除它即可,完全匹配你想要的输出效果。
内容的提问来源于stack exchange,提问作者Kalpesh Koli
相关产品推荐
相关产品推荐

