You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:30:54