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

使用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);

逻辑说明

  1. SalesWithFlags CTE通过窗口函数,给每个客户的所有记录统一标记两个状态:
    • TopProduct:提取该客户RN=1的Product值,所有同客户记录共享这个值
    • HasHigherRN:判断该客户是否存在排名≥2的记录,1表示存在,0表示不存在
  2. 筛选条件覆盖所有需求场景:
    • 若客户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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:43:12