我遇到了一个难题,想了很久也没有答案,非常感谢您的帮助!
问题:如何获取属于在过去5年内购买了牛奶或酸奶,并在随后15个月内购买了牛奶、酸奶或苹果的客户的所有记录?并按Customer_ID合并结果?
原始数据:
| 日期|项目|客户_ID|体积|
| --|--|--|--|
| 2021年1月1日|牛奶| 1345 | 2 |
| 2021年3月1日|苹果| 1345 | 2 |
| 2021年1月1日|牛奶| 8845 | 2 |
| 2023年1月1日|牛奶| 8845 | 2 |
| 二〇二一年十一月三十日|奶酪| 8845 | 1 |
目的数据表:
| 客户_ID|日期1|项目|体积|日期2|项目|体积|......这是一个好消息。|
| --|--|--|--|--|--|--|--|
| 1345 |2021年1月1日|牛奶| 2 |2021年3月1日|苹果| 2 ||
或简单
| 日期|项目|客户_ID|体积|
| --|--|--|--|
| 2021年1月1日|牛奶| 1345 | 2 |
| 2021年3月1日|苹果| 1345 | 2 |
对于第1步的分析是很好的。
我的尝试:
with t1 as (
select
customer_id
, date
, item
, sum(volume)
from table
where item in ('milk', 'yogurt')
and date between to_date(20181030) and to_date(2023-10-30)
),
t2 as (
select
customer_id
, date
, item
, sum(volume)
from table
where item in ('milk', 'yogurt','apple')
and date between to_date(20181030) and to_date(2023-10-30)
)
select
a.customer_id
, a.date as day1
, a.item as item1
, a.volume as v1
, b.date as day2
, b.item as item2
, b.volume as v2
from t1
inner join t2
on t1.customer_id = t2.customer_id
and (t1.date < t2.date and t1.date - t2.date < 456)
字符串
结果返回的是一个混乱的联合情况。日期被打乱了。一个客户有多条记录。如果该客户在接下来的15个月内多次购买苹果/牛奶/酸奶,则结果在一行中只返回一条记录。
你能告诉我出了什么问题吗?我该怎么做才能达到目的?谢谢!
4条答案
按热度按时间l7mqbcuq1#
这样的东西可能是你所追求的:
字符串
查询:
型
测试结果:
型
6tqwzwtp2#
为了扩展我之前的回答,并回答关于多次购买的问题,这里有一个样本数据,在原始数据的15个月内有2次购买,加上另一个比前2次超过15个月但比第3次不到15个月:
字符串
完全相同的查询:
型
结果如下:
型
0sgqnhkj3#
如何获取过去5年中购买牛奶或酸奶的客户以及在接下来的15个月内购买牛奶、酸奶或苹果的客户的所有记录?并按Customer_ID合并结果?
语言有点混乱。如果你想得到:
1.每个
customer_id
的所有记录1.如果在过去5年(60个月)内,他们购买了牛奶或酸奶,
1.如果在购买牛奶或酸奶后的15个月内,他们还购买了牛奶,酸奶或苹果。
然后你可以使用
MATCH_RECOGNIZE
:字符串
其中,对于样本数据:
型
产出:
| 客户ID| DT|项目|体积|
| --|--|--|--|
| 1345 |2021-01-01 00:00:00|牛奶| 2 |
| 1345 |2021-03-01 00:00:00|苹果| 2 |
如果你不想使用
MATCH_RECOGNIZE
,那么你可以使用解析函数和条件聚合:型
它的输出是一样的。
如果您只想要匹配的项目(而不是客户购买的所有项目),则:
型
它为您的示例数据输出相同的结果,因为该客户没有购买任何其他项目。
fiddle
whlutmcx4#
在解释了期间条件后更新了答案。这里是一个具有更大样本数据集的选项(添加了3行-其中一行是Yoghurt),用于测试求和和多个日期。
字符串
主SQL -选项1 -每个客户一行
型
提供的样本数据结果:
型
主SQL -选项2 -导致多行
型
提供的样本数据结果:
型