Row_Number()根据连续行

时间:2015-10-27 18:14:54

标签: sql-server sql-server-2008 partitioning dense-rank

我正在研究SQL Server 2008的查询,它需要以一种考虑表中行的连续性质的方式进行分区,这意味着它没有"内存"并在连续性分解时重新启动行编号。

举例说明:

declare @test table 
(
CustomerId  varchar(10),
ItemId  varchar(10),
PlatformName varchar(10),
date    datetime
)

insert into @test values ('aaaa', 'x', 'mobile','2015-10-24 22:52:47')
insert into @test values ('aaaa', 'x', 'mobile','2015-10-23 22:56:47')
insert into @test values ('aaaa', 'k', 'mobile','2015-10-22 21:52:47')
insert into @test values ('aaaa', 'k', 'tablet','2015-10-20 22:12:47')
insert into @test values ('aaaa', 'x', 'mobile','2015-10-19 20:52:47')
insert into @test values ('aaaa', 'k', 'tablet','2015-10-18 12:52:47')
insert into @test values ('aaaa', 'k', 'tablet','2015-10-16 12:52:47')

SELECT
t.*,
ROW_NUMBER() OVER (PARTITION BY t.CustomerId,t.ItemId,t.PlatformName ORDER        BY t.Date DESC) as rowNo
FROM @test t
ORDER BY t.Date DESC 

以下查询返回:rowNo

1
2
1
1
3
2
3

取代期望的:

1 
2 
1 
1 
1 
1 
2

如果是第5行和第6行,它应该重新开始计数,因为当你认为连续性使它与初始分区分开时它是一个新的分区。

我还需要根据行编号对行进行排名,如下所示:

1 
1 
2 
3 
4 
5 
6 
7 
7

1 个答案:

答案 0 :(得分:3)

您要做的是创建一个仅在分区更改时更改的指示器。您可以使用以下技巧完成此操作。由于给定分区中的行号递增,如果从每行中的递增数中减去该值,则将获得整个分区序列的相同数字。

这是任何分区开头的图表。

 row number     partition row number     row number-partition number    
     x                  1                     x-1
     x+1                2                     x-1
     ...
     x+n                n+1                   x-1

x将在下一个分区更改,但分区号将从1开始,您将获得分区中每一行的相同数字,直到下一个顺序分区。

然后将此结果用作分区的一部分,您的问题就解决了。

以下是在SQL中编写代码的方法:

WITH cte AS(SELECT *, ROW_NUMBER() OVER(Order By date DESC)
              - ROW_NUMBER() OVER(Partition By customerid, itemid, platformname
                                            Order By date DESC) rn FROM @test)
SELECT *, ROW_NUMBER() OVER(Partition By customerid, itemid, platformname, rn 
                                            Order By date DESC) rn2 
FROM cte
ORDER BY date DESC