Sql-Server

在沒有 CTE/內聯表的情況下計算目前值和下一個值之間的差異

  • March 14, 2019

我有一張表,上面有使用者 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

引用自:https://dba.stackexchange.com/questions/232034