在 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......
提前感谢您的任何帮助。
您遇到了
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