SQL 查询以确定历史记录的周期 table

SQL Query to determine periods from a history table

我有一个历史记录 table,可以对用户的历史状态进行快照。为简单起见,我们称它为 "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(),但考虑到您可以在一段时间的中间有多余的历史记录,它会变得有点复杂......

正如您所说 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