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
相关产品推荐
相关产品推荐

