我想找到每次子猫更改或再次返回的第一个日期,特定的子猫可能会被报告多次

问题描述 投票:0回答:1

在 Oracle DB 上工作。我有以下数据

客户 类别 子类别 日期
1 饲料 颗粒 23 年 10 月 5 日
1 饲料 干草 23 年 9 月 18 日
1 饲料 颗粒 23 年 8 月 6 日
1 饲料 颗粒 23 年 7 月 4 日
1 饲料 颗粒 21-6月_23
1 配件 23 年 5 月 15 日
1 配件 01-Mar_23

对于每个客户和类别,我想要他们每次返回子类别的第一个日期。例如颗粒是在 6 月 21 日首次购买的,此后又购买了几次,然后他们改用干草 - 所以我们将报告该行,然后返回颗粒,因此再次需要该行。所以一个提取的查询

客户 类别 子类别 日期
1 饲料 颗粒 23 年 10 月 5 日
1 饲料 干草 23 年 9 月 18 日
1 饲料 颗粒 21-6月_23
1 配件 01-Mar_23

从以上数据

Min 与 group by 不起作用,因为它只会给我子类别的第一个实例,我想要每次返回子类别时的第一个日期。

看看这里的其他问题,我认为分区可能会有所帮助,但我似乎无法让它正常工作。也许排名属于某个地方?

我觉得这对于那些知道自己在做什么的人来说非常简单和明显,但显然那不是我,因为我只走了几步 select * from......

提前感谢您的任何帮助。

sql oracle gaps-and-islands group partition-by
1个回答
1
投票

您遇到了

gaps and islands
问题,您可以使用两个 row_number 之间的差异为每个连续的行组提供唯一的 id :

with cte as (
  select Customer,
       Category,
       Subcategory,
       purchase_date,
       row_number() over (partition by Customer, Category order by purchase_date) -
       row_number() over (partition by Customer, Category, Subcategory order by purchase_date) as grp
from mytable
)
select CUSTOMER, CATEGORY, SUBCATEGORY, min(PURCHASE_DATE) as PURCHASE_DATE
from cte
group by CUSTOMER, CATEGORY, SUBCATEGORY, grp

演示在这里

© www.soinside.com 2019 - 2024. All rights reserved.