Sql server 从历史记录表确定期间的SQL查询

Sql server 从历史记录表确定期间的SQL查询,sql-server,sql-server-2014,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

我有一个记录用户历史状态的历史表。为了简单起见,让我们称之为“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被禁用)


什么查询可以有效地得到这个结果?我怀疑它会涉及到代码>引号()/代码>或<代码> 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 
我可能会使用LAG()查找上次更改后的时间。然后,您可以使用CTE或类似工具轻松总结所有内容。