ROW_Count() 根据顺序重新开始
ROW_Count() To Start Over Based On Order
Create Table #Test (
ID Int Primary Key Identity,
Category VarChar(100)
)
Insert into #Test
(Category)
Values
('Banana'),
('Banana'),
('Banana'),
('Banana'),
('Banana'),
('Banana'),
('Strawberry'),
('Strawberry'),
('Strawberry'),
('Banana'),
('Banana')
Select
*
,ROW_NUMBER() Over (Partition by Category order by ID) as RowNum
From #Test
Order by ID
所以这个脚本 return 是这样的:
ID Category RowNum
1 Banana 1
2 Banana 2
3 Banana 3
4 Banana 4
5 Banana 5
6 Banana 6
7 Strawberry 1
8 Strawberry 2
9 Strawberry 3
10 Banana 7
11 Banana 8
这很有道理,除了我想要它 return 这个:
ID Category RowNum
1 Banana 1
2 Banana 2
3 Banana 3
4 Banana 4
5 Banana 5
6 Banana 6
7 Strawberry 1
8 Strawberry 2
9 Strawberry 3
10 Banana 1
11 Banana 2
我希望它在碰到一组新香蕉时重新开始计数。显然我的数据并不是真正的香蕉,但它很容易可视化。
这次香蕉的复发算是新的了,所以我们看到这个就想从一个开始数。绞尽脑汁也想不出好办法。我明白为什么它不起作用,但想不出让它起作用的方法。关于执行此操作的最佳方法有什么建议吗?
有几种不同的方法可以解决这个问题。一种方法是 row_number()
方法的区别。此方法将识别相同的相邻类别组:
Select t.*,
row_number() over (partition by grp, category order by id) as rownum
From (select t.*,
(row_number() over (order by id) -
row_number() over (partition by category order by id)
) as grp
from #Test t
) t
Order by ID;
您也可以使用 lag()
找出分组,但这将适用于 SQL Server 2005 和 2008 以及更新的版本。
Create Table #Test (
ID Int Primary Key Identity,
Category VarChar(100)
)
Insert into #Test
(Category)
Values
('Banana'),
('Banana'),
('Banana'),
('Banana'),
('Banana'),
('Banana'),
('Strawberry'),
('Strawberry'),
('Strawberry'),
('Banana'),
('Banana')
Select
*
,ROW_NUMBER() Over (Partition by Category order by ID) as RowNum
From #Test
Order by ID
所以这个脚本 return 是这样的:
ID Category RowNum
1 Banana 1
2 Banana 2
3 Banana 3
4 Banana 4
5 Banana 5
6 Banana 6
7 Strawberry 1
8 Strawberry 2
9 Strawberry 3
10 Banana 7
11 Banana 8
这很有道理,除了我想要它 return 这个:
ID Category RowNum
1 Banana 1
2 Banana 2
3 Banana 3
4 Banana 4
5 Banana 5
6 Banana 6
7 Strawberry 1
8 Strawberry 2
9 Strawberry 3
10 Banana 1
11 Banana 2
我希望它在碰到一组新香蕉时重新开始计数。显然我的数据并不是真正的香蕉,但它很容易可视化。
这次香蕉的复发算是新的了,所以我们看到这个就想从一个开始数。绞尽脑汁也想不出好办法。我明白为什么它不起作用,但想不出让它起作用的方法。关于执行此操作的最佳方法有什么建议吗?
有几种不同的方法可以解决这个问题。一种方法是 row_number()
方法的区别。此方法将识别相同的相邻类别组:
Select t.*,
row_number() over (partition by grp, category order by id) as rownum
From (select t.*,
(row_number() over (order by id) -
row_number() over (partition by category order by id)
) as grp
from #Test t
) t
Order by ID;
您也可以使用 lag()
找出分组,但这将适用于 SQL Server 2005 和 2008 以及更新的版本。