如果下一个值为空,则通过对值进行分组来设置RowNumber

时间:2015-04-21 10:30:59

标签: sql-server

我正在使用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

1 个答案:

答案 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
相关问题