SQL如何匹配字母列重复值调整set_id生成统一alt_set_id?
解法
你需要的逻辑可以通过标准的窗口函数实现,无需游标,性能远高于逐行判断的方案,SQL如下:
WITH letter_grp AS ( SELECT *, -- 标记当前行是否为新连续字母分组的起点 CASE WHEN LAG(letter) OVER(ORDER BY row_id) != letter OR LAG(letter) OVER(ORDER BY row_id) IS NULL THEN 1 ELSE 0 END AS new_grp_flag FROM sort_test ), grp_id AS ( SELECT *, -- 累加标记生成连续分组的唯一ID SUM(new_grp_flag) OVER(ORDER BY row_id ROWS UNBOUNDED PRECEDING) AS group_id FROM letter_grp ) SELECT row_id, set_id, letter, -- 取每个分组首次出现的set_id作为alt_set_id MIN(set_id) OVER(PARTITION BY group_id) AS alt_set_id FROM grp_id ORDER BY row_id;
逻辑说明
- 第一步用
LAG函数获取上一行的letter值,识别连续相同letter的分组起点 - 第二步对分组起点标记做累加,给每个连续相同letter的分组分配唯一分组ID
- 第三步按分组ID取每组最小的set_id(即分组第一行的set_id)作为整组的alt_set_id
上述SQL执行结果和你给出的期望输出完全匹配。
内容的提问来源于stack exchange,提问作者SashaSQL
相关产品推荐
相关产品推荐

