如何在SQL中满足条件时将所有ID替换为指定Account ID
解决SQL新增列统一替换为PRIM_IND='Y'对应ACT_ID的问题
你之前写的CASE WHEN PRIM_IND = 'Y' THEN ACT_ID ELSE ACT_ID END没用是因为它只针对每行自己的PRIM_IND判断,结果每行还是输出自己的ACT_ID,根本没把'Y'对应的ID同步到所有行。要实现所有行都用PRIM_IND='Y'对应的ACT_ID,得用窗口函数跨行取值,下面是两种常用方案:
方案1:用MAX() OVER()(推荐)
如果你的数据集里只有一个PRIM_IND='Y'的行,或者需要按某个分组(比如同属一个订单/客户)取每组的目标ID,用这个方法:
全局统一取值(整个表只有一个主ID)
SELECT *, -- 提取PRIM_IND='Y'的ACT_ID,所有行都显示这个值 MAX(CASE WHEN PRIM_IND = 'Y' THEN ACT_ID END) OVER () AS PRIMARY_ACT_ID FROM your_table;
按分组取值(每组有一个主ID)
如果需要按某列分组(比如GROUP_COLUMN是分组标识),每组单独取自己的PRIM_IND='Y'对应的ID:
SELECT *, MAX(CASE WHEN PRIM_IND = 'Y' THEN ACT_ID END) OVER (PARTITION BY GROUP_COLUMN) AS PRIMARY_ACT_ID FROM your_table;
原理:CASE WHEN PRIM_IND='Y' THEN ACT_ID END会在非主行返回NULL,MAX()函数会忽略NULL,只保留分组里唯一的主ID,OVER()让这个值同步到所有行。
方案2:用FIRST_VALUE()排序取值
通过排序把PRIM_IND='Y'的行放到最前面,然后取该行的ACT_ID:
SELECT *, FIRST_VALUE(ACT_ID) OVER ( ORDER BY CASE WHEN PRIM_IND = 'Y' THEN 0 ELSE 1 END ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS PRIMARY_ACT_ID FROM your_table;
原理:排序时让主行(PRIM_IND='Y')优先级最高(排第0位),FIRST_VALUE()取排序后的第一个ACT_ID,ROWS BETWEEN确保覆盖所有行。
内容的提问来源于stack exchange,提问作者SanJoe1980
相关产品推荐
相关产品推荐

