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

SQL Server 2008查询:获取各ID最新状态及对应日期

解决SQL Server 2008中获取每个ID最新活动记录的问题

嘿,我来帮你搞定这个查询问题!针对你给出的数据表,要获取每个ID对应的最新活动状态和日期,甚至处理同一日期存在多个状态的情况,我给你准备了两种适配SQL Server 2008的方案:

方案1:同一日期仅保留指定优先级的状态

如果同一日期有多个状态(比如同时有Open和Closed),你希望优先保留某一种状态(比如Closed),可以用ROW_NUMBER()窗口函数来实现:

WITH RankedRecords AS (
    SELECT 
        ID,
        Status,
        Date,
        -- 按ID分组,先按日期从新到旧排序;日期相同时,让Closed状态排前面(可根据需求调换优先级)
        ROW_NUMBER() OVER (
            PARTITION BY ID 
            ORDER BY Date DESC, CASE WHEN Status = 'Closed' THEN 1 ELSE 2 END ASC
        ) AS RowNum
    FROM YourTableName -- 替换成你的实际表名
)
SELECT ID, Status, Date
FROM RankedRecords
WHERE RowNum = 1;

逻辑说明:

  • CTE部分:给每个ID下的记录编号,最新日期的记录会被标记为RowNum=1;若日期相同,通过CASE语句指定状态优先级(比如Closed优先,你也可以改成Open优先,只要调换1和2的位置就行)。
  • 主查询:筛选出每个ID的第一条记录,也就是最新日期(及指定优先级状态)的那条。

用你的示例数据测试,结果会是:

IDStatusDate
A-1Closed2018-01-05
B-2Closed2018-02-06
C-3Open2018-03-07

方案2:同一日期的所有状态都保留

如果同一日期的多个状态都需要展示(比如B-2在2018-02-06的Open和Closed都要显示),可以把ROW_NUMBER()换成RANK(),这样同一日期的记录会获得相同的排名:

WITH RankedRecords AS (
    SELECT 
        ID,
        Status,
        Date,
        RANK() OVER (
            PARTITION BY ID 
            ORDER BY Date DESC
        ) AS RankNum
    FROM YourTableName
)
SELECT ID, Status, Date
FROM RankedRecords
WHERE RankNum = 1;

这个方案的测试结果里,B-2的两条2018-02-06的记录都会被返回,符合“最新日期下所有活动都展示”的需求。

记得把代码里的YourTableName替换成你实际使用的表名哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:47:47