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
我有一个历史记录 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