0

我想编写一个查询,该查询使用“加入概念”来为每个订单返回自同一客户的上一个订单以来经过的天数。

我正在使用AdventureWorks2017数据库,表Sales.SalesOrderHeader

我尝试了以下代码,但我实际上希望它通过连接概念:

select customerid,
    orderdate,
    salesorderid,
    datediff(day, 
            (select top(1) s1.orderdate 
             from  sales.SalesOrderHeader s1
             where s1.CustomerID=s.CustomerID
                   and (s1.OrderDate = s.Orderdate 
                       and s1.SalesOrderID < s.Salesorderid
                       or  s1.OrderDate < s.orderdate)
             order by s1.orderdate desc,s1.SalesOrderID desc
             ),
            orderdate) as Daysdifference  
    from sales.SalesOrderHeader s  
    order by CustomerID,OrderDate,SalesOrderID
4

2 回答 2

0

我会这样写

SELECT s.CustomerID,
       s.OrderDate,
       s.SalesorderID,
       datediff(day, s1.OrderDate, s.OrderDate) as Daysdifference  
FROM sales.SalesOrderHeader s
OUTER APPLY (
  SELECT top(1) s1.OrderDate-- maybe MAX(s1.OrderDate) ?
  FROM sales.SalesOrderHeader s1
  WHERE s1.CustomerID = s.CustomerID
    AND ((s1.OrderDate = s.OrderDate 
          AND s1.SalesOrderID < s.SalesOrderID) -- I've added parenthesis
       OR  s1.OrderDate < s.OrderDate)
  ORDER BY s1.OrderDate DESC, s1.SalesOrderID DESC
) s1
ORDER BY s.CustomerID, s.OrderDate, s.SalesOrderID

或者可能是这样的?

SELECT s.customerID,
       s.orderDate,
       s.SalesOrderID,
       datediff(day, MAX(s1.OrderDate), s.OrderDate) as Daysdifference  
FROM sales.SalesOrderHeader s
LEFT JOIN sales.SalesOrderHeader s1 ON s1.CustomerID = s.CustomerID
                                AND ((s1.OrderDate = s.OrderDate 
                                  AND s1.SalesOrderID < s.SalesOrderID) -- I've added parenthesis
                                OR  s1.OrderDate < s.OrderDate))
GROUP BY s.CustomerID, s.OrderDate, s.salesorderId
ORDER BY s.CustomerID, s.OrderDate, s.SalesOrderID
于 2020-10-23T07:11:34.513 回答
0

从您现有的查询开始,一种简单的方法使用横向连接:

select s.customerid, s.orderdate, s.salesorderid,
    datediff(day, s.orderdate, s1.orderdate) days_difference
from sales.salesorderheader s
cross apply (
    select top(1) s1.orderdate 
    from sales.salesorderheader s1
    where s1.customerid = s.customerid
    and (s1.orderdate < s.orderdate) or (s1.orderdate = s.orderdate and s1.id < s.id)
    order by s1.orderdate desc, s1.id desc
) s1

这回答了您关于如何使用连接实现逻辑的问题。然而,让我指出,这将更有效地表达为lag()

select customerid, orderdate, salesorderid,
    datediff(day, orderdate, lag(orderdate) over(partition by customer_id order by order_date, id) days_difference
from sales.salesorderheader s
于 2020-10-21T12:41:08.733 回答