Sql server 从历史记录表确定期间的SQL查询
我有一个记录用户历史状态的历史表。为了简单起见,让我们称之为“UserFooHistory”。现在我想写一个查询,找出用户的Foo被禁用的总时间。因此,使用以下示例数据: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
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