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

SQL Server按ID、年月分组后依据状态优先级选取指定行

实现方案

核心思路是通过自定义状态优先级权重,配合开窗函数ROW_NUMBER()实现分组内按优先级取数,你之前的方向没问题,只需要调整排序规则即可。

具体逻辑

  1. 按ID+Date的年月维度做分区,保证每个ID每个月为一个独立分组
  2. 为状态自定义优先级权重,优先级越高权重值越小:
    • 状态I权重设为1(最高优先级)
    • 状态S权重设为2
    • 状态R权重设为3
    • 其余所有状态权重统一设为4(不参与优先级判定,随机返回即可)
  3. 每个分组内按权重升序排序,取排序后第一行即为符合要求的结果

代码示例(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:54:03