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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:30:19