2015-12-20 45 views
2

我有一個記錄用戶歷史狀態快照的歷史記錄表。爲了簡單起見,我們稱之爲「UserFooHistory」。現在我想寫一個查詢來找出用戶的Foo被禁用的總時間。因此,與下面的示例數據:用於確定歷史記錄表中的句點的SQL查詢

UserId Date  FooEnabled 
------ ----  ---------- 
123  2015-12-01 true 
123  2015-12-04 false 
123  2015-12-06 false 
123  2015-12-09 true 
123  2015-12-11 true 
123  2015-12-12 false 
123  2015-12-14 true 

從這個數據,我希望看到7天的結果(富由12/4禁用 - 12/9,然後從12/12 - 12/14)。

什麼查詢會有效地得到這個結果?我懷疑這將是涉及LEAD()LAG(),但考慮到事實,你可以在一個週期的中間有多餘的歷史記錄,它變得更復雜一點的東西......

+0

我可能會使用LAG()來查找自上次改變的時間。然後,您可以使用CTE或其他方法輕鬆地將所有內容進行總結。 – ssn

回答

1

正如你所說LEAD/LAG是這樣的去。試試這個

;WITH cte 
    AS (SELECT Lead(dates) 
        OVER( 
        partition BY userid 
        ORDER BY dates) lead_date,* 
     FROM yourtable) 
SELECT userid, 
     Sum(Datediff(day, dates, lead_date)) 
FROM cte 
WHERE fooenabled = 'false' 
GROUP BY userid 
相關問題