我正在使用Sql Server 2008
。我想按条件对数据进行分组,并为其设置RowNumber。表中的所有列都不是唯一值。
如果Any Row出现为Blank,请将先前的非空行分组并为其设置行号。
我的表格数据如下:
Code Name Location
Db1 Name1 N
Db3 Name3 S
NULL NULL NULL
Db1 Name1 N
NULL NULL NULL
Db1 Name1 N
NULL NULL NULL
Db1 Name1 S
Db4 Name4 S
我需要像这样的 OUTPUT :
Sno Code Name Location
1 Db1 Name1 N
1 Db3 Name3 S
2 Db1 Name1 N
3 Db1 Name1 N
4 Db1 Name1 S
4 Db4 Name4 S
答案 0 :(得分:2)
如果没有ORDER BY列,则没有下一行。所以我添加了一个id作为身份来解决这个问题:
DECLARE @t table(id int identity(1,1), Code char(3), Name char(5), Location char(1))
INSERT @t values
('Db1','Name1','N'),('Db3','Name3','S'),(NULL,NULL,NULL),
('Db1','Name1','N'),(NULL,NULL,NULL),('Db1','Name1','N'),
(NULL,NULL,NULL),('Db1','Name1','S'),('Db4','Name4','S')
;WITH cte as
(
SELECT
row_number() over (order by id)
- row_number() over (order by id * case when code is not null then 1 end) x,
Code, Name, Location
FROM @t
)
SELECT
dense_rank() over (order by x) Sno,
Code, Name, Location
FROM cte
WHERE code is not null
结果:
Sno Code Name Location
1 Db1 Name1 N
1 Db3 Name3 S
2 Db1 Name1 N
3 Db1 Name1 N
4 Db1 Name1 S
4 Db4 Name4 S