2017-05-16 6 views
0

mssqlでnorthwind dbを使用して、顧客の最後の2つの注文日を取得し、2つの注文間の時間を計算しようとしています。Correlatedクエリを使用して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; 

誰でも手助けできます。 ありがとうございます

+0

2番目から最後の順序を取得する2番目のクエリを作成します。同社でこれに参加してください。次に、結合されたクエリの受注日と受注日の間の日付を計算します。 –

答えて

0

ノースウィンドは長年にわたって時代遅れです。 AdventureWorksでも置き換えられました。以下は後者を使用しますが、簡単にスキーマに変換できるはずです。 2つの異なるアプローチ。最後の2つのselectステートメントは、結果を検証するために使用されます。顧客30099には注文が1つしかないことに注意してください。

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; 
+0

最初のselectステートメントは、cteがどのように動作するかを示すためのものです。 – SMor

+0

tx、私はあなたが行ったことを理解して理解しようとしています。 – user1161137

関連する問題