web-dev-qa-db-ja.com

CTE /インラインテーブルなしで現在の値と次の値の差を計算します

ユーザー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
thisSQLlife

効率は、テーブルに対して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
3
Lennart