如何基于GRP=3规则生成GRP_N_VO列并关联全量数据
解决GRP分组关联GRP_N_VO并生成重复行的SQL方案
现有数据表包含字段:
- ID:同一ID可对应不同GRP和N_VO值
- GRP:分组标识
- N_VO:组成员身份阶段标识
- DAT:组成员身份发生日期(与N_VO关联)
需求:
- 对
GRP=3的行,按相同N_VO分组、DAT升序编号,生成GRP_N_VO字段(例如N_VO=3的两行对应3_1和3_2) - 将所有
GRP≠3的行通过N_VO关联到对应的GRP_N_VO分组,若同一N_VO对应多个GRP_N_VO,则生成重复行,最终得到全量数据结果
实现代码
WITH grp3_mapping AS ( -- 生成GRP=3的行对应的GRP_N_VO映射关系 SELECT N_VO, DAT AS grp3_dat, CONCAT(N_VO, '_', ROW_NUMBER() OVER (PARTITION BY N_VO ORDER BY DAT ASC)) AS GRP_N_VO FROM your_table WHERE GRP = 3 ) -- 关联原表与映射表,输出最终结果 SELECT t.ID, t.GRP, t.N_VO, t.DAT, m.GRP_N_VO FROM your_table t LEFT JOIN grp3_mapping m ON t.N_VO = m.N_VO -- GRP=3的行需匹配自身日期,确保对应正确的GRP_N_VO AND (t.GRP != 3 OR t.DAT = m.grp3_dat) ORDER BY t.ID, t.GRP, t.DAT, m.GRP_N_VO;
代码说明
- 映射表生成:
grp3_mapping子查询专门处理GRP=3的行,通过ROW_NUMBER()窗口函数按N_VO分组、DAT升序生成编号,拼接成N_VO_编号格式的GRP_N_VO,同时保留GRP=3的日期用于后续精准匹配。 - 关联逻辑:
GRP≠3的行:仅通过N_VO关联映射表,同一N_VO对应多个GRP_N_VO时,自动生成重复行,满足分组关联需求。GRP=3的行:额外通过日期匹配映射表的对应记录,确保自身的GRP_N_VO准确对应。
- 排序规则:按
ID、GRP、DAT、GRP_N_VO排序,让结果更规整易读。
特殊情况处理
如果存在GRP≠3的行,其N_VO在GRP=3中无对应记录,这类行的GRP_N_VO会显示为NULL:
- 若要过滤这类数据,可在查询末尾添加
WHERE m.GRP_N_VO IS NOT NULL - 若要自定义填充值,可使用
COALESCE(m.GRP_N_VO, '自定义内容')替换m.GRP_N_VO
内容的提问来源于stack exchange,提问作者geek45
相关产品推荐
相关产品推荐

