我有一个有两列的表,即
CreatedOn: DateTime当记录被创建时,IsResponseExpected: (Yes/No)表示预期结果。样本数据:
CreatedOn IsResponseExpected
--------------------------------------
2021-11-29 11:03 Yes
2021-11-29 11:03 Yes
2021-11-29 10:58 Yes
2021-11-29 10:58 Yes
2021-11-29 10:53 Yes
2021-11-29 10:53 Yes
2021-11-29 10:48 Yes
2021-11-29 10:48 Yes
2021-11-29 10:43 Yes
2021-11-29 10:43 Yes
2021-11-29 10:38 Yes
2021-11-29 10:38 Yes
2021-11-29 10:33 Yes
2021-11-29 10:33 Yes
2021-11-29 10:28 No
2021-11-29 10:28 Yes
2021-11-29 10:23 Yes
2021-11-29 10:23 Yes
2021-11-29 10:18 Yes
Run Code Online (Sandbox Code Playgroud)
在几天的时间里,它们IsResponseExpected没有任何顺序,有时是“是”,有时是“否”。
我可以查询表并查看数据,但结果很大,确实需要汇总以进行分析。
我想在桌子上做一个跑步组,这样我就可以看到三列
即From、To 和IsResponseExpected。
像下面这样的东西:
From To IsResponseExpected
---------------------------------------------------------
2021-11-29 11:03 2021-11-29 10:23 Yes
2021-11-29 10:28 2021-11-29 10:28 No
2021-11-29 10:28 2021-11-29 10:18 Yes
Run Code Online (Sandbox Code Playgroud)
我应该如何实现解决方案?
这被称为一个Gaps-and-Islands问题
这是一种使用窗口函数row_number()来创建Grp
with cte as (
Select *
,Grp = row_number() over (order by [CreatedOn]) - row_number() over (partition by [IsResponseExpected] order by [CreatedOn])
from YourTable
)
Select [From] = min([CreatedOn])
,[to] = max([CreatedOn])
,[IsResponseExpected]
From cte
Group By Grp,[IsResponseExpected]
Order by [From],[To]
Run Code Online (Sandbox Code Playgroud)
结果