如何在 SQL Server 中创建具有范围的运行组

Imr*_*zvi 1 sql-server

我有一个有两列的表,即

  • 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)

我应该如何实现解决方案?

Joh*_*tti 5

这被称为一个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)

结果

在此输入图像描述