请参阅下面的DDL:
CREATE TABLE #Test (ID)
INSERT INTO #Test values (1)
INSERT INTO #Test values (2)
INSERT INTO #Test values (3)
INSERT INTO #Test values (0)
INSERT INTO #Test values (4)
INSERT INTO #Test values (5)
INSERT INTO #Test values (6)
INSERT INTO #Test values (8)
INSERT INTO #Test values (12)
INSERT INTO #Test values (19)
INSERT INTO #Test values (0)
INSERT INTO #Test values (44)
我正在寻找输出以下(GroupID,ID)的查询。
1,1
1,2
1,3
2,4
2,5
2,6
2,8
2,12
2,19
3,44
ID为0的行会拆分组。
查询将如下所示:
select GroupID = row_number() over (order by (select null)),ID from #Test
GroupID需要使用零值的行进行拆分。上面的查询只是为每一行创建一个新的GroupID。
答案 0 :(得分:2)
SQL表表示无序集。因此,您无法对数据结构执行任何操作,因为它没有排序。但是,通过添加标识列可以轻松解决这个问题:
CREATE TABLE #Test (
TestId int identity(1, 1) primary key, -- the primary key is not strictly necessary, just my habit with identity columns.
Val int
);
(我冒昧地将您的列重命名为val
而不是id
以避免混淆。)标识列捕获插入顺序。
该组计算为给定值之前的零数。在SQL Server 2012+中,可以使用累积总和轻松完成:
select t.*,
1 + sum(case when val = 0 then 1 else 0 end) over (order by testid) as groupid
from #test t;
我注意到你不想在输出中使用零,为此,在累积和之后使用子查询:
select *
from (select t.*,
1 + sum(case when val = 0 then 1 else 0 end) over (order by testid) as groupid
from #test t
) t
where val <> 0;