我有一张历史记录表,可以拍摄用户历史状态的快照。为简单起见,我们将其称为" UserFooHistory"。现在我想编写一个查询来查找用户的Foo被禁用的总时间。所以使用以下示例数据:
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天的结果(Foo从12/4 - 12/9禁用,然后从12月12日 - 12月14日禁用)。
什么查询可以有效地获得此结果?我怀疑它会涉及LEAD()
或LAG()
,但考虑到你可以在一段时间内拥有多余的历史记录,它会变得更复杂...... / p>
答案 0 :(得分: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