SQL Server根据行值对不相关的记录进行分组

时间:2018-12-17 14:27:29

标签: sql sql-server tsql grouping row-number

如何将重复记录分组?

我只有一栏表示记录是开始记录,结束记录还是明细记录。明细记录是在开始记录之后和结束记录之前存在的记录。

我想将这些记录与唯一的标识符归为一组,以便每次出现结束记录时,下一个记录系列都会获得一个新的组ID。

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

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

解决方案之前的示例:

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

1 个答案:

答案 0 :(得分:1)

您可以使用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