ユーザーIDと彼の訪問日を含むテーブルがあります。次の訪問列を追加し、これを使用して訪問間の日差を計算するCTEを作成しました。
With Visits AS
(
SELECT [uid],[visit_date]
,(SELECT MIN(visit_date)
FROM Visit E2
WHERE E2.visit_date > E1.visit_date AND
E2.uid= E1.uid ) AS next_visit_date
FROM Visit E1
)
SELECT uid, DATEDIFF(day, visit_date, next_visit_date)
FROM Visits
CTEまたは一時テーブルはメモリ効率の良い方法ではないので、効率を上げることを検討しています。ありがとうございました
効率は、テーブルに対して2つのスキャンを実行しているという事実により依存していると思います。代わりにウィンドウ関数を使用してみてください:
SELECT uid, visit_date
, LEAD(visit_date) OVER (PARTITION BY uid
ORDER BY visit_date) as next_visit_date
FROM Visit E1
そこから差分を計算できます
SELECT uid, DATEDIFF(day, visit_date,
LEAD(visit_date) OVER (
PARTITION BY uid
ORDER BY visit_date
))
FROM Visit E1