统计同一张表上多个条件的SQL

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

我正在尝试编写一个查询,返回在 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 天和其他产品条件的正确方法。

sql oracle oracle-sqldeveloper
2个回答
0
投票

这更接近,但不清楚当客户有多个初始镜子或自行车订单时您希望发生什么。

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') 

0
投票

从 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)
)
© www.soinside.com 2019 - 2024. All rights reserved.