如何基于多条件更新数据表中的APPROVAL列数据
解决方案:按规则填充APPROVAL列
假设你的数据表名为your_table_name,包含CUSTOMER、CUSTOMER_NEW、SALE_SHORT_ID、SALE_ID、APPROVAL(待填充)五列,以下用SQL窗口函数实现需求中的规则:
核心逻辑实现
基础版(允许多个最大长度行标Y)
WITH customer_stats AS ( SELECT *, -- 统计同一客户分组内的SALE_SHORT_ID不同值数量 COUNT(DISTINCT SALE_SHORT_ID) OVER (PARTITION BY CUSTOMER) AS distinct_short_id_count, -- 统计同一客户+SALE_SHORT_ID分组内SALE_ID的最大长度 MAX(LENGTH(SALE_ID)) OVER (PARTITION BY CUSTOMER, SALE_SHORT_ID) AS max_sale_id_len, -- 当前行SALE_ID的长度 LENGTH(SALE_ID) AS current_sale_id_len FROM your_table_name ) SELECT CUSTOMER, CUSTOMER_NEW, SALE_SHORT_ID, SALE_ID, CASE -- 规则1:CUSTOMER_NEW与CUSTOMER不相等 WHEN CUSTOMER_NEW <> CUSTOMER THEN 'Y' -- 规则2:CUSTOMER_NEW等于CUSTOMER,且该客户分组内存在不同的SALE_SHORT_ID WHEN distinct_short_id_count > 1 THEN 'Y' -- 规则3:CUSTOMER_NEW等于CUSTOMER,且当前行是该客户+SALE_SHORT_ID分组内SALE_ID最长的行 WHEN current_sale_id_len = max_sale_id_len THEN 'Y' -- 其他情况标记为N ELSE 'N' END AS APPROVAL FROM customer_stats;
进阶版(仅保留一个最大长度行标Y)
如果规则3要求同一分组内仅一行标Y(即使多个行的SALE_ID长度同为最大值),可以添加行号排序:
WITH customer_stats AS ( SELECT *, COUNT(DISTINCT SALE_SHORT_ID) OVER (PARTITION BY CUSTOMER) AS distinct_short_id_count, -- 给分组内的行按SALE_ID长度降序、SALE_ID本身降序排序 ROW_NUMBER() OVER (PARTITION BY CUSTOMER, SALE_SHORT_ID ORDER BY LENGTH(SALE_ID) DESC, SALE_ID DESC) AS rn FROM your_table_name ) SELECT CUSTOMER, CUSTOMER_NEW, SALE_SHORT_ID, SALE_ID, CASE WHEN CUSTOMER_NEW <> CUSTOMER THEN 'Y' WHEN distinct_short_id_count > 1 THEN 'Y' -- 仅取分组内排序第一的行标Y WHEN rn = 1 THEN 'Y' ELSE 'N' END AS APPROVAL FROM customer_stats;
适配说明
- 若使用SQL Server,将
LENGTH()替换为LEN()即可。 - 代码中的
your_table_name需要替换为你的实际表名。
内容的提问来源于stack exchange,提问作者mindc
相关产品推荐
相关产品推荐

