填充GroupID

时间:2015-12-22 15:25:45

标签: sql sql-server

请参阅下面的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。

1 个答案:

答案 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;