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 以及更新的版本。