ROW_Count()根据订单重新开始

War*_*now 9 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'),
('Banana'),
('Banana')

Select
     *
    ,ROW_NUMBER() Over (Partition by Category order by ID) as RowNum

From #Test

Order by ID
Run Code Online (Sandbox Code Playgroud)

所以这个脚本返回这个:

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
Run Code Online (Sandbox Code Playgroud)

这是完全合理的,除了我希望它返回这个:

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
Run Code Online (Sandbox Code Playgroud)

我希望它在点击一组新香蕉时重新开始计数.显然,我的数据不是真正的香蕉,但它可以很容易地进行可视化.

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

Gor*_*off 5

有几种不同的方法来解决这个问题.一种方法是方法的差异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;
Run Code Online (Sandbox Code Playgroud)

您还可以使用lag(),但这将适用于SQL Server 2005和2008以及更新版本.