SQL Server按ID、年月分组后依据状态优先级选取指定行
实现方案
核心思路是通过自定义状态优先级权重,配合开窗函数ROW_NUMBER()实现分组内按优先级取数,你之前的方向没问题,只需要调整排序规则即可。
具体逻辑
- 按
ID+Date的年月维度做分区,保证每个ID每个月为一个独立分组 - 为状态自定义优先级权重,优先级越高权重值越小:
- 状态
I权重设为1(最高优先级) - 状态
S权重设为2 - 状态
R权重设为3 - 其余所有状态权重统一设为4(不参与优先级判定,随机返回即可)
- 状态
- 每个分组内按权重升序排序,取排序后第一行即为符合要求的结果
代码示例(MySQL版本,其他数据库仅需调整年月提取语法)
SELECT ID, Status, Date FROM ( SELECT ID, Status, Date, -- 开窗分区+按自定义权重排序 ROW_NUMBER() OVER ( PARTITION BY ID, DATE_FORMAT(Date, '%Y-%m') ORDER BY CASE Status WHEN 'I' THEN 1 WHEN 'S' THEN 2 WHEN 'R' THEN 3 ELSE 4 END ASC -- 若同优先级下需要取最新/最早的记录,可追加排序规则,例如:, Date DESC ) AS row_num FROM 你的表名 ) AS temp WHERE row_num = 1;
不同数据库年月提取替换方案
- PostgreSQL:替换
DATE_FORMAT(Date, '%Y-%m')为TO_CHAR(Date, 'YYYY-MM') - SQL Server:替换
DATE_FORMAT(Date, '%Y-%m')为FORMAT(Date, 'yyyy-MM') - Oracle:替换
DATE_FORMAT(Date, '%Y-%m')为TO_CHAR(Date, 'YYYY-MM')
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

