SQL 服务器根据行值对不相关的记录进行分组

SQL Server Grouping unrelated records according to row value

如何对重复记录进行分组?

我有一个列表示记录是开始记录、结束记录还是详细记录。详细记录是存在于开始记录之后和结束记录之前的记录。

我想用唯一标识符将这些记录分组在一起,以便每次有结束记录时,下一系列记录都会获得一个新的组 ID。

我尝试了一系列自连接、子查询和 cte 在不构建自定义函数、视图或 CTE 的情况下,我希望在单个 select 查询中构建它。

非常感谢任何建议或指示。

解决方案前的例子:

--------------------------------------------------
| ID      | RecordType    |  SomeValue
--------------------------------------------------
|001      | Start record  |  some header info
|002      | Detail Record |  value
|003      | Detail Record |  value
|004      | Detail Record |  value
|005      | End Record    |  some other header info
|006      | Start Record  |  some header info
|007      | Detail Record |  Value
|008      | End  Record   |  some other header info

我想达到的目标:

------------------------------------------------------------------
| ID      | RecordType    |  SomeValue             | RecordGroup
------------------------------------------------------------------
|001      | Start record  |  some header info      | 001
|002      | Detail Record |  value                 | 001
|003      | Detail Record |  value                 | 001
|004      | Detail Record |  value                 | 001
|005      | End Record    |  some other header info| 001
|006      | Start Record  |  some header info      | 002
|007      | Detail Record |  Value                 | 002
|008      | End  Record   |  some other header info| 002

您可以使用 LAG 函数和 运行 SUM。以下假定没有分区,行按 ID 排序:

SELECT ID, RecordType, SomeValue,
       SUM(chg) OVER (ORDER BY ID) AS grp
FROM (
    SELECT ID, RecordType, SomeValue,
           CASE WHEN LAG(RecordType) OVER (ORDER BY ID) IN ('Start record', 'Detail Record') THEN 0 ELSE 1 END AS chg
    FROM t
) cte1

Demo on DB Fiddle