【问题标题】:ROW_Count() To Start Over Based On OrderROW_Count() 根据订单重新开始
【发布时间】:2015-11-02 23:45:43
【问题描述】:
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

我希望它在遇到一组新香蕉时重新开始计数。显然我的数据并不是真正的香蕉,但它很容易可视化。

香蕉的这种重复被认为是新的,所以我们看到这个时想从一个开始计数。我一直在绞尽脑汁,想不出一个好的方法来做到这一点。我明白为什么它不工作,但想不出办法让它工作。对最好的方法有什么建议吗?

【问题讨论】:

    标签: sql sql-server window-functions


    【解决方案1】:

    有几种不同的方法可以解决这个问题。一种方法是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 以及更新的版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 2014-06-25
      相关资源
      最近更新 更多