如何使用相关查询从Northwind数据库获取当前和最后一个订单

时间:2017-05-16 16:07:28

标签: sql sql-server correlated-subquery northwind

在mssql上使用northwind db,我试图检索客户的最后两个订单日期并计算两个订单之间的时间。

类似

select c.CompanyName, o.OrderDate, o2.OrderDate,
       DateDiff(d, o.OrderDate, o2.OrderDate) as TimeElapsed

遗憾的是不知道如何从那里构建它。

我有类似的东西,但它仍然是错误的。

select c.CompanyName, o.OrderDate, o2.OrderDate,
       DateDiff(d, o.OrderDate, o2.OrderDate) as TimeElapsed
from Orders o 
    INNER JOIN Customers ON c.CustomerID = o.CustomerID
    INNER JOIN (
    select OrderID, OrderDate
        FROM Orders 
        order by OrderDate
        OFFSET 1 ROWS
        FETCH NEXT 1 ROW ONLY
    ) as o2 ON o.OrderID = o2.OrderID;

任何人都可以提供帮助。 谢谢

1 个答案:

答案 0 :(得分:0)

多年来,罗斯文已经过时了;甚至AdventureWorks也被取代了。以下使用后者,但您应该能够轻松地将其转换为您的架构。两种不同的方法。最后2个select语句用于验证结果。请注意,客户30099只有一个订单。

set nocount on;

with cte as (select SalesOrderID, OrderDate, CustomerID, row_number () over (partition by CustomerID order by OrderDate desc) as rn
from Sales.SalesOrderHeader)
select top 10 * from cte 
where rn <= 2 
order by CustomerID, rn;

with cte as (select SalesOrderID, OrderDate, CustomerID, row_number () over (partition by CustomerID order by OrderDate desc) as rn
from Sales.SalesOrderHeader)
select cte.CustomerID, min(cte.OrderDate) as mindate, max(cte.OrderDate), 
case when min(cte.OrderDate) = max(cte.OrderDate) then cast(null as int) 
else datediff(day, min(cte.OrderDate), max(cte.OrderDate)) end as dif 
from cte 
where rn <= 2
group by cte.CustomerID 
order by CustomerID;

with cte as (select SalesOrderID, OrderDate, CustomerID, row_number () over (partition by CustomerID order by OrderDate desc) as rn
from Sales.SalesOrderHeader)
select cte.CustomerID, minr.OrderDate as mindate, cte.OrderDate as maxdate, 
datediff(day, minr.OrderDate, cte.OrderDate) as dif 
from cte left join cte as minr on cte.CustomerID = minr.CustomerID and minr.rn = 2
where cte.rn = 1
order by cte.CustomerID;

select top 2 CustomerID, OrderDate from Sales.SalesOrderHeader where CustomerID = 30118 order by OrderDate desc;
select top 2 CustomerID, OrderDate from Sales.SalesOrderHeader where CustomerID = 30099 order by OrderDate desc;