Oracle数据库查询需求:提取子品类每次切换的首次日期
Oracle SQL:提取子品类切换时的首次日期
你需要在每个Customer+Category维度下,识别连续相同子品类的分组,并提取每个分组的首次日期(包括子品类回归后的新分组)。普通GROUP BY无法处理连续分组的场景,需要结合窗口函数实现。
解决方案思路
- 用
LAG()窗口函数在Customer+Category分区内,按日期升序获取上一行的子品类,判断当前行是否属于新的子品类分组。 - 通过累加标记生成每个连续子品类分组的唯一ID。
- 按
Customer+Category+Subcategory+分组ID聚合,提取每个分组的最早日期。
完整SQL代码
WITH grouped_subcats AS ( SELECT Customer, Category, Subcategory, "Date", -- 生成连续子品类的分组ID:首次出现或子品类切换时,分组ID递增 SUM(CASE WHEN prev_sub != Subcategory OR prev_sub IS NULL THEN 1 ELSE 0 END) OVER (PARTITION BY Customer, Category ORDER BY "Date" ASC) AS subcat_group FROM ( SELECT Customer, Category, Subcategory, "Date", -- 获取同分区内上一行的子品类 LAG(Subcategory) OVER (PARTITION BY Customer, Category ORDER BY "Date" ASC) AS prev_sub FROM your_table -- 替换为你的实际表名 ) t ) SELECT Customer, Category, Subcategory, MIN("Date") AS "Date" FROM grouped_subcats GROUP BY Customer, Category, Subcategory, subcat_group ORDER BY Customer, Category, "Date" DESC; -- 按日期倒序匹配示例结果,可按需调整
代码说明
LAG(Subcategory):在Customer+Category分区内,按日期升序获取前一行的子品类,用于判断是否发生子品类切换。- 分组ID生成:通过
SUM(...) OVER(...)累加切换标记,将连续相同的子品类归为同一组。 - 最后按分组聚合取最小日期,得到每个子品类分组的首次出现日期,包括回归后的新分组。
内容的提问来源于stack exchange,提问作者WanderingMushroom
相关产品推荐
相关产品推荐

