我正在尝试编写一个查询,返回在 2020 年 1 月 1 日之后购买“镜子”或“自行车”并且在 12 个月内还购买了“书”或“沙发”的客户(使用计数,以防他们购买多次)。我编写的查询不完整,因此我需要一些帮助 - 我缺少计算未来 12 个月内订单数量的列。
我写的查询(不完整)
select Customer_id, product,order_date,count(o2.order_date)
from Orders o1
left join orders o2
on o1.customer_id=o2.customer_id
and o2.order_date>o1.order_date
where o1.product='mirror' or o1.product='bike' then '1'
and TO_DATE( '1 Jan 2020', 'DD MON YYYY' )
我尝试了左连接和 CTE,但两者都不起作用,因为我找不到使用 +365 天和其他产品条件的正确方法。
这更接近,但不清楚当客户有多个初始镜子或自行车订单时您希望发生什么。
SELECT o1.Customer_id, o1.product, o1.order_date, count(o2.order_date)
FROM Orders o1
INNER JOIN Orders o2
ON o1.customer_id=o2.customer_id
AND o2.order_date>=o1.order_date
AND o2.order_date < ADD_MONTHS(o1.order_date, 12)
AND o2.product IN ('book', 'sofa')
WHERE o1.product IN ('mirror', 'bike')
从 Oracle 12 开始,您可以使用
MATCH_RECOGNIZE
:
SELECT *
FROM (
SELECT *
FROM Orders
WHERE order_date >= DATE '2020-01-01'
AND order_date < DATE '2022-01-01'
AND product IN ('book', 'sofa', 'mirror')
)
MATCH_RECOGNIZE(
PARTITION BY customer_id
ORDER BY order_date
ALL ROWS PER MATCH
PATTERN (book_or_sofa mirror)
DEFINE
book_or_sofa AS product IN ('book', 'sofa'),
mirror AS product = 'mirror'
AND order_date <= ADD_MONTHS(PREV(order_date), 12)
)