Sql 根据订单重新开始的行计数()

Sql 根据订单重新开始的行计数(),sql,sql-server,window-functions,Sql,Sql Server,Window Functions,所以这个脚本返回: 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'

所以这个脚本返回:

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
这很有道理,除了我想让它还这个:

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
我希望它在碰到一组新香蕉时重新开始计数。显然,我的数据并不是真的香蕉,但它很容易可视化


香蕉的这种复发被认为是新的,所以当我们看到这一点时,我们想从一开始计数。我一直在绞尽脑汁,想不出一个好办法。我理解它为什么不起作用,但想不出一个办法让它起作用。关于最好的方法有什么建议吗?

有几种不同的方法。一种方法是不同的
行数()
方法。此方法将识别相同的相邻类别组:

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
您还可以使用
lag()
计算分组,但这在SQL Server 2005和2008以及更高版本中都适用

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;