Как получить текущий и последний заказ из базы данных Northwind с помощью коррелированных запросов

Используя базу данных Northwind на mssql, я пытаюсь получить две последние даты заказа клиента и рассчитать время между двумя заказами.

Так что-то вроде

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;

может ли кто-нибудь помочь. Спасибо


person user1161137    schedule 16.05.2017    source источник
comment
Создайте второй запрос, который извлекает предпоследний заказ. Присоединяйтесь к этому на компанию. Затем вычислите разницу между датой заказа в объединенном запросе и датой заказа в этом.   -  person Jacob H    schedule 16.05.2017


Ответы (1)


Northwind уже давно устарел; даже AdventureWorks был заменен. В следующем используется последний, но вы сможете легко перевести его в свою схему. Два разных подхода. Последние 2 оператора выбора используются для проверки результатов. Обратите внимание, что у клиента 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;
person SMor    schedule 16.05.2017
comment
И этот первый оператор select предназначен только для демонстрации того, как работает cte. - person SMor; 16.05.2017
comment
tx, я пытаюсь пройти и понять, что вы сделали. - person user1161137; 17.05.2017