从 SQL Server 中的时间窗口创建分组(组和岛)

Posted

技术标签:

【中文标题】从 SQL Server 中的时间窗口创建分组(组和岛)【英文标题】:Creating Grouping from time windows in SQL Server (Group and Island) 【发布时间】:2021-02-05 17:42:58 【问题描述】:

我有一张桌子,上面有每个代理的时间表。我需要将同一日程事件的时间从多个条目分组到同一块的单个条目。

例如,突出显示的 SupportAdmin 会话可以背靠背组合成一行。见下例:

第 9 行和第 10 行需要通过取最早的 startDt 和最晚的 EndDt 组合成一行。第 12、13、14 行同样如此。

导致:

我尝试过使用诸如 row_number()、RANK()、LAG、LEAD 等窗口函数,但这些函数都不能有效地处理这种困境。任何线索都会很棒。

谢谢。

编辑。此外,仅添加分组方法也不适合解决方案,因为分组将应用于整个列表,而不仅仅是“本地块”。

【问题讨论】:

为什么不使用MIN(StartTime), MIN(StartDt), MAX(EndDt),然后按前三列分组? @BJones 这不起作用,因为它会在列表中的所有类别中分组。因此,对于“管理员”,它将获取第一个管理员 startDt (06/01/2021 10:00:00) 和最后一个 EndDt(06/01/2021 14:40:00) - 这当然是不正确的 【参考方案1】:

使用分组方式

SELECT CID,STATE,[DESC],MIN(StartTime),MIN(StartDt),MAX(StartDt)
FROM TABLE 
GROUP BY CID,STATE,[DESC]

【讨论】:

再次与上面的答案相同,这将在所有“管理员”中分组,无论他们在列表中的哪个位置。它看起来确实是一个简单的解决方案,但实际上要困难得多。

以上是关于从 SQL Server 中的时间窗口创建分组(组和岛)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server中的开窗函数是啥?

小5聊Sql Server基础之Sql语句文件组分区函数分组方案对应分区表的简单步骤

SQL Server - 在按特定列分组时构建动态范围的数字

sqlserver用group by分组了,但是怎么才能给每一组数据按照从小到大编号呢

SQL Server窗口框架——ROWSRANGE

Flink SQL 分组窗口函数 Group Window 实战