You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL查询求助:筛选3周内购12周未买新品的零售商

帮你排查SQL筛选问题的思路和示例

嘿,我来帮你揪出这个SQL的问题!先把你的核心需求再理一遍:你要找的是最近3周有采购行为的零售商,而且他们采购的商品是过去12周里完全没买过的新产品,对吧?

从你给出的SQL开头来看,大概率是逻辑或者语法细节出了问题,我给你拆解几个常见坑和正确的实现思路:

首先,你可能踩的几个坑

  • 表连接逻辑错误:你用了旧的逗号连接表,但没写清楚关联条件,很容易产生笛卡尔积,导致数据爆炸或者结果完全不对。建议用JOIN语法,更清晰可控。
  • 缺失商品维度的关联:要判断是不是“12周内没买过的新产品”,必须关联商品编码(比如PROD_CD),如果你的WHERE子句里没加这个关联,根本没法区分商品是否是首次采购。
  • 时间窗口定义模糊:你有没有明确3周和12周的时间区间?比如是从当前日期往前推,还是某个固定的时间段?日期计算错误会直接导致筛选范围不对。
  • 聚合缺失GROUP BY:你的SQL里用了SUM(RC.SLS_ACT),但没写GROUP BY,这会导致语法错误(大部分数据库不允许),或者只返回一条汇总数据,不是你要的零售商级别的结果。

给你一个符合需求的SQL示例

假设你的表中有PROD_CD(商品编码)字段,我写一个标准的实现框架,你可以对照调整:

SELECT 
    RC.RETAILER_CD,
    RC.INV_NO,
    RC.DOC_DT,
    SUM(RC.SLS_ACT) AS TOTAL_SALES
FROM 
    RANGE_CREATION RC
WHERE 
    -- 第一步:筛选最近3周的采购记录
    RC.DOC_DT >= CURRENT_DATE - INTERVAL '3 weeks'
    -- 第二步:排除该零售商过去12周内买过的商品
    AND NOT EXISTS (
        SELECT 1
        FROM ACTIVITY_TXN AV
        WHERE 
            AV.RETAILER_CD = RC.RETAILER_CD -- 关联同一个零售商
            AND AV.PROD_CD = RC.PROD_CD     -- 关联同一个商品(核心!)
            AND AV.DOC_DT >= CURRENT_DATE - INTERVAL '12 weeks' -- 12周的时间范围
    )
GROUP BY 
    RC.RETAILER_CD, RC.INV_NO, RC.DOC_DT; -- 必须分组所有非聚合字段

关键细节解释

  1. 时间区间的灵活性:如果你的时间不是基于当前日期,而是某个固定的基准日(比如报表截止日),把CURRENT_DATE换成你的基准日期字段即可。
  2. NOT EXISTS的优势:相比NOT INNOT EXISTS不会因为子查询里的NULL值导致结果为空,逻辑更稳定。
  3. 数据完整性检查:确认ACTIVITY_TXN表包含了所有零售商过去12周的采购记录,如果有数据缺失,筛选结果也会不准。

如果你的SQL还有完整的WHERE子句或者具体的错误提示,可以补充出来,我能帮你更精准地排查!

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

火山引擎 最新活动