繁体   English   中英

SQL - 查找去年没有订购的客户以及他们订购了什么

[英]SQL - Find customers who have not ordered in the last year and what they ordered

我可以通过这样做找到去年没有订购的客户:

SELECT O.CustID, MAX(O.ORDERDATE) AS LastOrder FROM Orders O
WHERE LastOrder <= DATEADD(year,-1,GETDATE())
GROUP BY O.CustID

我想加入第二个表 (OrderDetails),其中包含名为 OrderID 的字段上的订单详细信息。

每个订单只有一件商品。 (我的数据实际上不是客户和订单——但这个类比适用于我正在做的事情)。

当我将此 OrderID 字段添加到查询中时,我的结果会成倍增加。 发生这种情况是因为当我分组时,我按 OrderID 和 CustID 分组,这将拉取每个特定的 OrderID。

我的问题是如何从 OrderDetails 表中提取最后一个 OrderID,其中该客户的 orderID 已超过 1 年。

这是我到目前为止所拥有的

SELECT OD.OrderID, O.CustID, MAX(O.ORDERDATE) AS LastOrder 
FROM Orders O
INNER JOIN OrderDetails OD
ON O.OrderID = OD.OrderID
WHERE LastOrder <= DATEADD(year,-1,GETDATE())
GROUP BY OD.OrderID, O.CustID
 

使用:

WITH cte AS (
  SELECT O.*
  FROM Orders O
  INNER JOIN OrderDetails OD
    ON O.OrderID = OD.OrderID
  QUALIFY MAX(O.OrderDate) OVER(PARTITION BY O.CustId) <= DATEADD(year,-1,CURRENT_DATE())
)
SELECT *
FROM cte
QUALIFY ROW_NUMBER() OVER(PARTITION BY CustId ORDER BY OrderDate DESC) = 1

所以几乎完全是 Lukasz 回答的一个片段,但是,两个 QUALIFY 过滤器可以合并:

WITH orders(cust_id, order_date, order_id) AS (
    SELECT column1
        ,to_date(column2,'yyyy-mm-dd')
        ,column3
    FROM VALUES
        (1,'2022-01-01',1),
        (1,'2021-01-01',2),
        (2,'2021-01-01',3),
        (3,'2021-01-01',4)
), order_details(order_id, details) AS (
    SELECT *
    FROM VALUES
        (1,'detail 1'),
        (2,'detail 2'),
        (3,'detail 3'),
        (4,'detail 4')
)
SELECT o.cust_id
    ,o.order_date as last_order_date
    ,od.details
FROM orders as o
JOIN order_details as od ON o.order_id = od.order_id
QUALIFY max(o.order_date) over(partition by o.cust_id) <= dateadd(year, -1, current_date) AND
   ROW_NUMBER() over (partition by o.cust_id ORDER BY o.order_date) = 1
ORDER BY 1;

但我倾向于先进行过滤(作为一个子选择或 CTE),然后加入order_details ,因为不需要详细信息,因此您将使 SQL 编译器最明显(应该看到 JOIN 可以之后完成)

WITH orders(cust_id, order_date, order_id) AS (
    SELECT column1
        ,to_date(column2,'yyyy-mm-dd')
        ,column3
    FROM VALUES
        (1,'2022-01-01',1),
        (1,'2021-01-01',2),
        (2,'2021-01-01',3),
        (3,'2021-01-01',4)
), order_details(order_id, details) AS (
    SELECT *
    FROM VALUES
        (1,'detail 1'),
        (2,'detail 2'),
        (3,'detail 3'),
        (4,'detail 4')
), stale_customers AS (
    SELECT *
    FROM orders AS o
    QUALIFY max(o.order_date) over(partition by o.cust_id) <= dateadd(year, -1, current_date) AND
        ROW_NUMBER() over (partition by o.cust_id ORDER BY o.order_date) = 1
)
SELECT o.cust_id
    ,o.order_date as last_order_date
    ,od.details
FROM stale_customers as o
JOIN order_details as od ON o.order_id = od.order_id
ORDER BY 1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM