SQL实现日期标记列:仅将首个DateColB大于DateColA的行标记为1
解决方案:仅标记首个满足条件的行为DateFlag=1
要实现仅标记首个(按DateColA排序后最早出现的)DateColB大于DateColA的行为1,其余行都为0,你可以通过以下几种方式修改SQL:
方法1:子查询定位目标行
通过子查询找到最早满足DateColB > DateColA的DateColA,再匹配标记:
SELECT DateColA, DateColB, CASE WHEN DateColA = ( SELECT MIN(DateColA) FROM table_A WHERE DateColB > DateColA ) AND DateColB > DateColA THEN 1 ELSE 0 END AS DateFlag FROM table_A ORDER BY DateColA;
如果存在多个行拥有相同的最小DateColA且都满足条件,这个方法会把这些行都标记为1。如果只需要标记其中一行,把子查询里的MIN(DateColA)改成DateColA并加上ORDER BY DateColA LIMIT 1即可。
方法2:窗口函数标记顺序
用ROW_NUMBER()窗口函数给满足条件的行按DateColA排序编号,仅编号为1的行标记为1:
SELECT DateColA, DateColB, CASE WHEN rn = 1 THEN 1 ELSE 0 END AS DateFlag FROM ( SELECT DateColA, DateColB, -- 仅给满足条件的行编号 CASE WHEN DateColB > DateColA THEN ROW_NUMBER() OVER (ORDER BY DateColA) ELSE NULL END AS rn FROM table_A ) AS ranked ORDER BY DateColA;
这个方法更灵活,不管DateColA是否唯一,都能精准标记最早出现的那一行满足条件的记录。
内容的提问来源于stack exchange,提问作者Benzilla
相关产品推荐
相关产品推荐

