You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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; -- 可选,按需调整排序方式

逻辑说明

  1. CTE部分:先为每条记录计算RowNum,PARTITION BY指定按格式化后的TargetDate2分组,ORDER BY CreatedOn DESC确保每个分组内最新的记录排在最前面,行号标记为1。
  2. 主查询:只筛选行号为1的记录,这样就得到了每个TargetDate2对应的最新CreatedOn的那条记录,同时保留了你需要的TargetDate2和TargetDate字段。

如果不需要显示CreatedOn,主查询里直接排除它即可,完全匹配你想要的输出效果。

内容的提问来源于stack exchange,提问作者Kalpesh Koli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:53:20