如何查找商品连续销售周数及筛选超3周连续销售记录
解决商品连续销售周数筛选问题
嘿Stephanie,这个问题我之前做销售分析的时候也遇到过,用SQL窗口函数就能完美解决!我给你拆解一下思路和具体代码:
核心思路
我们需要先把每个商品的有销售的周记录提取出来,然后识别出其中连续的周段,统计每个连续段的长度,最后筛选出长度超过3周的商品(或者对应的周记录)。
假设数据结构
先假设你的数据表大概是这样的(你可以根据实际表名和字段调整):
product_id: 商品ID(比如你的Product 456)week_number: 转换后的周号(比如数值类型的1,2,3... 或者带年份的202401,202402)sales_amount: 销售金额(用来判断该周是否有销售,>0即视为有销售)
分步SQL实现
1. 提取有销售的周记录
首先过滤掉无销售的周,只保留每个商品有销售的周,同时去重(避免同一周多条重复记录):
WITH product_sales_weeks AS ( SELECT product_id, week_number FROM your_sales_table WHERE sales_amount > 0 GROUP BY product_id, week_number ),
2. 识别连续销售的周段
用LAG()窗口函数获取每个商品上一个有销售的周号,通过判断当前周与上一周的差值是否为1,来划分连续的周分组:
continuous_groups AS ( SELECT product_id, week_number, -- 生成连续分组ID:如果当前周和上一周不连续,就创建新分组 SUM( CASE WHEN week_number - LAG(week_number) OVER (PARTITION BY product_id ORDER BY week_number) = 1 THEN 0 ELSE 1 END ) OVER (PARTITION BY product_id ORDER BY week_number) AS group_id FROM product_sales_weeks ),
3. 统计每个连续段的周数
对每个商品的每个连续分组,计算包含的周数:
group_week_counts AS ( SELECT product_id, group_id, COUNT(*) AS consecutive_weeks FROM continuous_groups GROUP BY product_id, group_id )
4. 筛选目标结果
- 如果只需要连续销售超过3周的商品ID:
SELECT DISTINCT product_id FROM group_week_counts WHERE consecutive_weeks > 3;
(按照你的描述,这里应该只会返回Product 456)
- 如果需要保留这些连续超过3周的具体周记录(排除连续≤3周的记录):
SELECT c.product_id, c.week_number FROM continuous_groups c JOIN group_week_counts g ON c.product_id = g.product_id AND c.group_id = g.group_id WHERE g.consecutive_weeks > 3;
注意事项
- 如果你的
week_number是字符串格式(比如'2024-W01'),需要先转换为数值类型再计算差值,避免字符串运算出错。 - 如果你的表已经是每个商品每周一条记录(包含无销售的周),可以先添加
has_sales标记(比如CASE WHEN sales_amount>0 THEN 1 ELSE 0 END),再按上述逻辑处理。
内容的提问来源于stack exchange,提问作者Stephanie
相关产品推荐
相关产品推荐

