使用CASE语句筛选带排名的Sales表记录的技术求助
问题解决方案
原SQL问题分析
你写的CASE条件逻辑矛盾,同一行的RN不可能同时等于1又大于1,Product也不可能既是'TBD'又不是'TBD',所以这条语句无法正确触发选择RN=2的逻辑,只能默认选RN=1的记录,不符合需求。
正确实现思路
要实现需求,需要先按客户(Cust)分组,判断每个客户的两个关键状态:
- 该客户RN=1的记录是否为'TBD'
- 该客户是否存在RN≥2的记录
基于这两个状态,再筛选对应RN的记录。可以用窗口函数给每个客户标记这两个状态,再进行筛选。
具体SQL实现
WITH SalesWithFlags AS ( SELECT *, -- 标记当前客户RN=1的Product值 MAX(CASE WHEN RN = 1 THEN Product END) OVER (PARTITION BY Cust) AS TopProduct, -- 标记当前客户是否有RN≥2的记录(1表示有,0表示无) MAX(CASE WHEN RN >= 2 THEN 1 ELSE 0 END) OVER (PARTITION BY Cust) AS HasHigherRN FROM Sales ) SELECT * FROM SalesWithFlags WHERE -- 情况1:默认选RN=1,除非满足情况2的触发条件 (RN = 1 AND NOT (TopProduct = 'TBD' AND HasHigherRN = 1)) -- 情况2:RN=1是TBD且有RN≥2的记录,选RN=2 OR (RN = 2 AND TopProduct = 'TBD' AND HasHigherRN = 1);
逻辑说明
SalesWithFlagsCTE通过窗口函数,给每个客户的所有记录统一标记两个状态:TopProduct:提取该客户RN=1的Product值,所有同客户记录共享这个值HasHigherRN:判断该客户是否存在排名≥2的记录,1表示存在,0表示不存在
- 筛选条件覆盖所有需求场景:
- 若客户RN=1的Product不是'TBD',直接保留RN=1的记录
- 若客户RN=1的Product是'TBD'但没有RN≥2的记录,保留RN=1的记录
- 若客户RN=1的Product是'TBD'且存在RN≥2的记录,保留RN=2的记录
内容的提问来源于stack exchange,提问作者Jono5454
相关产品推荐
相关产品推荐

