2016-10-10 7 views
0

顧客ごとに最後のX注文の平均金額を調べる必要があります。私のデータは、次のような構造になっています。最後のX注文の平均

  • カスタマーID
  • 総額

日は、私は、日付で注文、顧客IDによってpartitionningを試してみましたが、私は平均を見つけることができませんTOP Xの

+0

いくつかのサンプルデータと予想される出力を投稿してください。 –

+1

1つの方法は、顧客によって区分され、日付DESCによって順序付けられたrow_number()を計算することです - その問合せを内側の問合せとして使用し、row_number <= Xを選択して平均を取るか、WITH文で設定します。 – Cato

+0

明確ではない、質問を改善するためにここを見てください:https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – TheGameiswar

答えて

1

別のオプションは、CTEで、ROW_NUMBER()。以下はお客様の平均注文を示します。

Declare @YourTable table (CustID int,OrderDate Date,OrderAmount int) 
Insert Into @YourTable values 
(1,'2016-01-18',2500), 
(1,'2016-02-13',5000), 
(1,'2016-03-31',3000), 
(2,'2016-03-18',1800), 
(2,'2016-04-13',2200), 
(2,'2016-05-31',2500) 

;with cteBase as (
    Select * 
      ,RowNr=Row_Number() over (Partition By CustID Order By OrderDate Desc) 
    From @YourTable 
) 
Select CustID 
     ,AvgOrder = avg(OrderAmount) 
From cteBase 
Where RowNr<=2 
Group By CustID 

戻り

CustID AvgOrder 
1  4000 
2  2350 
+0

ありがとう!出来た。 – user107242

+0

@ user107242お役立ち情報正直なところ、窓の機能に慣れて...彼らは非常に貴重です。乾杯 –

0

使用ROW_NUMBERウィンドウ関数

select [Customer ID],Avg([Total Amount]) as avg_amt 
(
select row_number()over(partition by [Customer ID] order by [Date] desc) rn, * 
from yourtable 
) A 
Where Rn <= 5 --change it based on requirement 
Group by [Customer ID] 

現在のテーブルがトランザクションテーブルであるよう[Customer ID]がユニークですあなたは別のテーブルにはCustomerと呼ばれたかもしれないので、あなたが上記のクエリは、のリストを取得するためにOUTER APPLYで変更することができ

SELECT c.[Customer ID], 
     Avg([Total Amount]) 
FROM customers c 
     CROSS apply (SELECT TOP 5 [Total Amount] 
        FROM yourtable y 
        WHERE c.[Customer ID] = y.[Customer ID] 
        ORDER BY [Date] DESC) cs 
GROUP BY [Customer ID] 

も、このアプローチを使用することができ、ルックスすべてcustomersで、彼はavg Total Amountがゼロのトランザクションを作成しませんでした。

+0

ありがとう!出来た。 – user107242

0

一つの方法は、row_number()を使用しています。

select customerid, avg(totalamount) 
from (select t.*, 
      row_number() over (partition by customerid order by date desc) as seqnum 
     from t 
    ) t 
where seqnum <= x; 
関連する問題