用于从历史记录表

时间:2015-12-20 14:54:24

标签: sql-server sql-server-2014

我有一张历史记录表,可以拍摄用户历史状态的快照。为简单起见,我们将其称为" 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>

1 个答案:

答案 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