Row_Number() 按连续行分区
Row_Number() partitioning according to consecutive rows
我正在为 SQL Server 2008 查询,它需要以考虑 table 中行的连续性质的方式进行分区,这意味着它没有 "memory" 并在分区的连续性中断时重新开始行编号。
举例说明:
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
下面查询returns: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
您要做的是创建一个仅在分区更改时更改的指标。您可以使用以下技巧来做到这一点。由于行号在给定分区内递增,如果您从每行内递增的数字中减去行号,您将获得整个分区序列的相同数字。
这是任何分区开始处的图表。
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
我正在为 SQL Server 2008 查询,它需要以考虑 table 中行的连续性质的方式进行分区,这意味着它没有 "memory" 并在分区的连续性中断时重新开始行编号。
举例说明:
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
下面查询returns: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
您要做的是创建一个仅在分区更改时更改的指标。您可以使用以下技巧来做到这一点。由于行号在给定分区内递增,如果您从每行内递增的数字中减去行号,您将获得整个分区序列的相同数字。
这是任何分区开始处的图表。
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