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

如何修改SQL查询仅保留无Keep_Flag='N'的合格账户数据

筛选符合折扣资格的账户SQL修改

需求:修改现有SQL查询,仅展示无任何Keep_Flag='N'记录的账户全部字段——这类账户是过去12个月每个月都满足条件、符合额外费率折扣资格的账户,只要有一个月不满足(Keep_Flag='N')就会被排除。

原生成月度合格标记的查询

SELECT id, account_id, reg_con, tagg_reading, read_date,
CASE
    WHEN reg_con * tagg_reading < 60 
         AND TO_CHAR(read_date, 'MM-DD') BETWEEN '06-15' AND '10-15' THEN 'Y'
    WHEN reg_con * tagg_reading < 90 
         AND (TO_CHAR(read_date, 'MM-DD') BETWEEN '10-16' AND '12-31' OR TO_CHAR(read_date, 'MM-DD') BETWEEN '01-01' AND '06-14') THEN 'Y'
    ELSE 'N'
END AS Keep_Flag
FROM test;

修改后的查询方案

方法一:子查询筛选合格账户后关联原表

先筛选出所有记录的Keep_Flag都不为'N'的账户ID,再关联原表获取全部字段:

SELECT t.id, t.account_id, t.reg_con, t.tagg_reading, t.read_date,
       k.Keep_Flag
FROM test t
JOIN (
    SELECT account_id
    FROM (
        SELECT account_id,
               CASE
                   WHEN reg_con * tagg_reading < 60 
                        AND TO_CHAR(read_date, 'MM-DD') BETWEEN '06-15' AND '10-15' THEN 'Y'
                   WHEN reg_con * tagg_reading < 90 
                        AND (TO_CHAR(read_date, 'MM-DD') BETWEEN '10-16' AND '12-31' OR TO_CHAR(read_date, 'MM-DD') BETWEEN '01-01' AND '06-14') THEN 'Y'
                   ELSE 'N'
               END AS Keep_Flag
        FROM test
        -- 可选:添加过去12个月的时间过滤,比如 WHERE read_date >= CURRENT_DATE - INTERVAL '12 months'
    ) sub
    GROUP BY account_id
    HAVING MAX(Keep_Flag) = 'Y' -- 所有记录的Keep_Flag都是Y,Y排序优先级高于N,MAX为Y则无N记录
) k ON t.account_id = k.account_id;

方法二:窗口函数标记账户合格状态

用窗口函数计算每个账户的Keep_Flag最大值,直接过滤掉存在'N'的账户:

SELECT id, account_id, reg_con, tagg_reading, read_date, Keep_Flag
FROM (
    SELECT id, account_id, reg_con, tagg_reading, read_date,
           CASE
               WHEN reg_con * tagg_reading < 60 
                    AND TO_CHAR(read_date, 'MM-DD') BETWEEN '06-15' AND '10-15' THEN 'Y'
               WHEN reg_con * tagg_reading < 90 
                    AND (TO_CHAR(read_date, 'MM-DD') BETWEEN '10-16' AND '12-31' OR TO_CHAR(read_date, 'MM-DD') BETWEEN '01-01' AND '06-14') THEN 'Y'
               ELSE 'N'
           END AS Keep_Flag,
           MAX(
               CASE
                   WHEN reg_con * tagg_reading < 60 
                        AND TO_CHAR(read_date, 'MM-DD') BETWEEN '06-15' AND '10-15' THEN 'Y'
                   WHEN reg_con * tagg_reading < 90 
                        AND (TO_CHAR(read_date, 'MM-DD') BETWEEN '10-16' AND '12-31' OR TO_CHAR(read_date, 'MM-DD') BETWEEN '01-01' AND '06-14') THEN 'Y'
                   ELSE 'N'
               END
           ) OVER (PARTITION BY account_id) AS account_keep_status
    FROM test
    -- 可选:添加过去12个月的时间过滤,比如 WHERE read_date >= CURRENT_DATE - INTERVAL '12 months'
) sub
WHERE account_keep_status = 'Y';

结果说明

修改后的查询会仅返回Account_ID 1001的所有记录,Account_ID 1002因存在Keep_Flag='N'的记录会被排除。

内容的提问来源于stack exchange,提问作者Brent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 09:25:11