2

给定以下数据:

declare @temp table(id int identity primary key, val nvarchar)

insert into @temp values (NULL)
insert into @temp values (NULL)
insert into @temp values ('A')
insert into @temp values (NULL)
insert into @temp values (NULL)
insert into @temp values ('B')
insert into @temp values ('C')
insert into @temp values (NULL)
insert into @temp values (NULL)
insert into @temp values ('A')
insert into @temp values (NULL)
insert into @temp values (NULL)

我试图得到下面的输出。需要对记录进行分组,以便每个新值组编号增加一。值本身无关紧要 - 如果存在除 NULL 之外的任何值,则会添加新的组 ID。记录必须按 ID 排序。

Id Val  Group
-- ---  -----
1  NULL 1
2  NULL 1
3  A    2
4  NULL 2
5  NULL 2
6  B    3
7  C    4
8  NULL 4
9  NULL 4
10 A    5
11 NULL 5

我希望使用 PARTITION BY 是解决方案,但我似乎无法让这个工作(如果确实有可能/正确的方法。我有一个使用 LOOP 的解决方案,但我宁愿使用查询。我m 使用 SQL Server 2008。感谢您的任何建议。

select id, val, row_number() over (partition by X order by id) from @temp
4

1 回答 1

2

这可以满足您的要求:

select t.id, t.val, DENSE_RANK() over (order by prevval) as grouping
from (select *,
             (select top 1 id from @temp t2 where t2.val is not null and t2.id <= t.id order by id desc
             ) as prevval
      from @temp t
     ) t

这使用相关子查询来获取小于或等于给定值的最大 id,其中 id 不val为空(如果有)。然后它通过 id 对它们进行密集排序,以获得顺序分组。

如果您使用的是 SQL Server 2012,那么有一个相关的方法,没有子查询:

select t.id, t.val, DENSE_RANK() over (order by prevval) as grouping
from (select *,
             max(case when val is not null then id end) over (order by id) as prevval
      from @temp t
     ) t
于 2013-04-16T22:10:19.383 回答