从 SQL Server 中的时间窗口创建分组(组和岛)
Posted
技术标签:
【中文标题】从 SQL Server 中的时间窗口创建分组(组和岛)【英文标题】:Creating Grouping from time windows in SQL Server (Group and Island) 【发布时间】:2021-02-05 17:42:58 【问题描述】:我有一张桌子,上面有每个代理的时间表。我需要将同一日程事件的时间从多个条目分组到同一块的单个条目。
例如,突出显示的 Support 和 Admin 会话可以背靠背组合成一行。见下例:
第 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 中的时间窗口创建分组(组和岛)的主要内容,如果未能解决你的问题,请参考以下文章
小5聊Sql Server基础之Sql语句文件组分区函数分组方案对应分区表的简单步骤
SQL Server - 在按特定列分组时构建动态范围的数字