顧客ごとに最後のX注文の平均金額を調べる必要があります。私のデータは、次のような構造になっています。最後のX注文の平均
- カスタマーID
- 総額
日は、私は、日付で注文、顧客IDによってpartitionningを試してみましたが、私は平均を見つけることができませんTOP Xの
顧客ごとに最後のX注文の平均金額を調べる必要があります。私のデータは、次のような構造になっています。最後のX注文の平均
日は、私は、日付で注文、顧客IDによってpartitionningを試してみましたが、私は平均を見つけることができませんTOP Xの
別のオプションは、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
ありがとう!出来た。 – user107242
@ user107242お役立ち情報正直なところ、窓の機能に慣れて...彼らは非常に貴重です。乾杯 –
使用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
がゼロのトランザクションを作成しませんでした。
ありがとう!出来た。 – user107242
一つの方法は、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;
いくつかのサンプルデータと予想される出力を投稿してください。 –
1つの方法は、顧客によって区分され、日付DESCによって順序付けられたrow_number()を計算することです - その問合せを内側の問合せとして使用し、row_number <= Xを選択して平均を取るか、WITH文で設定します。 – Cato
明確ではない、質問を改善するためにここを見てください:https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – TheGameiswar