2015-08-10 2 views
9
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 

Так этот скрипт возвращает это:row_count(), чтобы начать За основании На заказ

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 

Я хочу он должен перезапустить счет, когда он попадает в новый набор бананов. Очевидно, что мои данные на самом деле не бананы, но это позволяет легко визуализировать.

Это повторение бананов считается новым, поэтому мы хотим начать отсчет с одного, когда увидим это. Я терзал свой мозг и не могу придумать хороший способ сделать это. Я понимаю, почему он не работает, но не может придумать способ заставить его работать. Любые советы по наилучшему способу сделать это?

ответ

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; 

Вы также можете выяснить группировки, используя lag(), но это будет работать в SQL Server 2005 и 2008, а также более поздних версий.

Смежные вопросы