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的第一条记录,也就是最新日期(及指定优先级状态)的那条。
用你的示例数据测试,结果会是:
| ID | Status | Date |
|---|---|---|
| A-1 | Closed | 2018-01-05 |
| B-2 | Closed | 2018-02-06 |
| C-3 | Open | 2018-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
相关产品推荐
相关产品推荐

