SQL查询需求:识别促销前后同店同款零件销售并生成sssp_ind标识
实现思路与SQL示例
核心逻辑
- 先明确促销活动的时间分界点(比如促销开始/结束日期),以此划分「促销前」「促销中/后」的时间范围
- 针对每个门店+零件的组合,判断是否同时存在促销前和促销后的销售记录
- 将判断结果作为新增标识字段
sssp_ind,关联回原销售数据表
SQL实现示例
假设你的销售表名为sales_records,包含字段:store_id(门店ID)、part_id(零件ID)、sale_date(销售日期),促销开始日期为'2024-01-01'。
方法1:窗口函数(高效适配大数据量)
WITH store_part_promo_check AS ( SELECT store_id, part_id, -- 标记该门店+零件是否有促销前记录 MAX(CASE WHEN sale_date < '2024-01-01' THEN 1 ELSE 0 END) AS has_pre_promo, -- 标记该门店+零件是否有促销后记录 MAX(CASE WHEN sale_date >= '2024-01-01' THEN 1 ELSE 0 END) AS has_post_promo FROM sales_records GROUP BY store_id, part_id ) SELECT sr.*, -- 同时满足促销前后都有记录则标记为1,否则为0 CASE WHEN sp.has_pre_promo = 1 AND sp.has_post_promo = 1 THEN 1 ELSE 0 END AS sssp_ind FROM sales_records sr JOIN store_part_promo_check sp ON sr.store_id = sp.store_id AND sr.part_id = sp.part_id;
方法2:EXISTS子查询(逻辑直观易理解)
SELECT *, CASE WHEN EXISTS ( SELECT 1 FROM sales_records pre WHERE pre.store_id = sr.store_id AND pre.part_id = sr.part_id AND pre.sale_date < '2024-01-01' ) AND EXISTS ( SELECT 1 FROM sales_records post WHERE post.store_id = sr.store_id AND post.part_id = sr.part_id AND post.sale_date >= '2024-01-01' ) THEN 1 ELSE 0 END AS sssp_ind FROM sales_records sr;
关键说明
- 替换示例中的
'2024-01-01'为实际促销时间分界点,如果促销有明确结束日期,可调整条件为:促销前sale_date < 促销开始日,促销后sale_date > 促销结束日 - 若只需输出符合条件的门店+零件组合,直接从
store_part_promo_check中筛选has_pre_promo=1 AND has_post_promo=1的记录即可 - 窗口函数方法仅需扫描数据表两次,在数据量较大时性能更优;子查询方法逻辑直白,适合小型数据集快速验证
内容的提问来源于stack exchange,提问作者user2507210
相关产品推荐
相关产品推荐

