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
如何对重复记录进行分组?
我有一个列表示记录是开始记录、结束记录还是详细记录。详细记录是存在于开始记录之后和结束记录之前的记录。
我想用唯一标识符将这些记录分组在一起,以便每次有结束记录时,下一系列记录都会获得一个新的组 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