基于数据子集关联记录的双规则SQL计算需求
实现基于Account-Customer关联的OUTPUT标记逻辑(SQL)
需求概述
- 规则1:若某个Account下存在至少一个Customer的
KEY='N',则该Account下所有Customer的OUTPUT设为'NOT OK' - 规则2:在规则1基础上,只要某个Customer因规则1被标记为
'NOT OK',那么这个Customer所有其他Account的关联记录,OUTPUT也必须是'NOT OK' - 特殊情况:客户4的
OUTPUT始终为'OK'——因为他从未出现在任何包含KEY='N'的Account中
SQL实现(兼容主流数据库)
以下方案适用于PostgreSQL、MySQL 8.0+、SQL Server等支持CTE的数据库:
WITH flagged_accounts AS ( -- 第一步:筛选出所有存在KEY='N'的Account SELECT Account FROM your_table WHERE KEY = 'N' GROUP BY Account ), risk_customers AS ( -- 第二步:找出所有关联过问题Account的Customer SELECT DISTINCT Customer FROM your_table JOIN flagged_accounts USING(Account) ) -- 第三步:生成最终OUTPUT字段 SELECT Account, Customer, KEY, CASE WHEN r.Customer IS NOT NULL THEN 'NOT OK' ELSE 'OK' END AS OUTPUT FROM your_table t LEFT JOIN risk_customers r ON t.Customer = r.Customer;
逻辑拆解
flagged_accounts:先定位所有触发规则1的Account,即包含KEY='N'的账户risk_customers:通过关联原表,找出所有在问题Account中出现过的Customer——这些客户就是需要全局标记的对象(对应规则2)- 最终查询:通过左关联判断每条记录的Customer是否属于风险客户,是则输出
'NOT OK',否则输出'OK'
该写法直接覆盖两个规则,同时自然满足客户4的例外情况:完全未关联过任何问题Account的客户,会被标记为'OK'。
内容的提问来源于stack exchange,提问作者Konrad Lubelski
相关产品推荐
相关产品推荐

