SQL实现:将同一序列号的多Flag记录合并为单条记录
问题:合并同序列号的Flag字段记录
现有表格片段(包含四列:SERIAL_NUMBER、BIP_WIDE_AREA_PORT、IP_FAST_REROUTE、GWIP_MULTICAST):
SERIAL_NUMBER | BIP_WIDE_AREA_PORT | IP_FAST_REROUTE | GWIP_MULTICAST _____________________________________________________________________ N7608760 YES NO NO N7608760 NO YES NO
需要将同一序列号的所有记录合并为单条,规则为:只要该序列号对应的某Flag字段存在任意一条YES记录,合并后该字段值为YES,否则为NO。期望的合并结果:
SERIAL_NUMBER | BIP_WIDE_AREA_PORT | IP_FAST_REROUTE | GWIP_MULTICAST _____________________________________________________________________ N7608760 YES YES NO
当前使用的CASE语句写法:
CASE WHEN P1.name LIKE '%BIP WIDE AREA PORT%' THEN 'Yes' ELSE 'No' END AS BIP_WIDE_AREA_PORT, CASE WHEN P1.name LIKE 'NEXTG BACKUP' THEN 'Yes' ELSE 'No' END AS NEXTG_BACKUP
不知如何实现合并需求。
解决方案
核心思路是按序列号分组,对每个Flag字段使用聚合函数保留优先级更高的YES(字符串YES的排序优先级高于NO,用MAX()即可实现)。
方法1:基于原始表直接生成并合并
如果你的Flag字段是通过P1表的name字段判断生成的,直接将CASE语句嵌套进聚合函数,再按SERIAL_NUMBER分组:
SELECT SERIAL_NUMBER, MAX(CASE WHEN P1.name LIKE '%BIP WIDE AREA PORT%' THEN 'YES' ELSE 'NO' END) AS BIP_WIDE_AREA_PORT, MAX(CASE WHEN P1.name LIKE '%IP FAST REROUTE%' THEN 'YES' ELSE 'NO' END) AS IP_FAST_REROUTE, MAX(CASE WHEN P1.name LIKE '%GWIP MULTICAST%' THEN 'YES' ELSE 'NO' END) AS GWIP_MULTICAST, MAX(CASE WHEN P1.name LIKE 'NEXTG BACKUP' THEN 'YES' ELSE 'NO' END) AS NEXTG_BACKUP FROM P1 GROUP BY SERIAL_NUMBER;
方法2:基于已生成Flag字段的表格合并
如果已经有了包含Flag字段的中间表(假设表名为device_flags),直接分组聚合即可:
SELECT SERIAL_NUMBER, MAX(BIP_WIDE_AREA_PORT) AS BIP_WIDE_AREA_PORT, MAX(IP_FAST_REROUTE) AS IP_FAST_REROUTE, MAX(GWIP_MULTICAST) AS GWIP_MULTICAST FROM device_flags GROUP BY SERIAL_NUMBER;
原理说明:字符串'YES'的ASCII码大于'NO',因此MAX()聚合函数会在分组内优先保留YES值,只要该组内有一条记录为YES,合并后的字段值就为YES,完全符合需求。
内容的提问来源于stack exchange,提问作者Noshin Islam
相关产品推荐
相关产品推荐

