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

SQL中基于键字段判断日期归属及标记最新记录的实现咨询

SQL中基于键字段判断日期归属及标记最新记录的实现咨询

嗨,你选ROW_NUMBER()这个思路完全没错!我来帮你把这个逻辑梳理清楚,直接上能用的方案~

先看你的示例数据,核心需求就是按ID分组,把每组里结束日期最晚的那条标记为1,其他标记为2对吧?那用窗口函数就能轻松实现:

SELECT
    ID,
    START,
    END,
    CASE 
        WHEN ROW_NUMBER() OVER (PARTITION BY ID ORDER BY END DESC) = 1 THEN 1
        ELSE 2
    END AS FLAG_REQUIRED
FROM your_table_name;

我给你拆解下这段代码的逻辑:

  • PARTITION BY ID:把整个数据集按ID拆分成独立的小分组,保证每个ID的记录只和自己组内的比
  • ORDER BY END DESC:在每个ID组里,按END日期从晚到早排序,最晚的那条会排在组内的第一位
  • ROW_NUMBER()会给每个组里的行分配一个递增的序号,第一位就是1,用CASE把这个序号转换成你需要的FLAG值就行

另外补充个小细节:如果你的数据里可能出现同一个ID有多条记录END日期完全相同的情况,ROW_NUMBER()会给它们分配不同的序号(比如两个最晚日期的行,一个是1,一个是2)。要是你希望这些同属最晚日期的行都标记为1,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK(),代码调整成这样:

SELECT
    ID,
    START,
    END,
    CASE 
        WHEN RANK() OVER (PARTITION BY ID ORDER BY END DESC) = 1 THEN 1
        ELSE 2
    END AS FLAG_REQUIRED
FROM your_table_name;

这样所有拥有最晚END日期的行都会被标记为1,你可以根据实际业务需求选对应的函数~

备注:内容来源于stack exchange,提问作者Country girl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 07:13:00