2013-08-23 2 views
0

Мне нужна помощь в нумерации данных на основе появления определенного значения.Нумерация данных на основе вхождения

Позволяет рассмотреть на вход

Col1 Col2 
1 a 
2 1 
3 2 
4 3 
5 a 
6 1 
7 4 
8 a 
9 2 
10 3 

Я хочу, чтобы пронумеровать их на основе совпадения «а» в col2. Выход должен выглядеть так:

Col1 Col2 Result 
1 a 1 
2 1 1 
3 2 1 
4 3 1 
5 a 2 
6 1 2 
7 4 2 
8 a 3 
9 2 3 
10 3 3 
+0

Данные не имеют порядка, отличного от указанного в запросе. – podiluska

+0

Итак, 1-4 и 5-7 и 8-10 являются логическими группами, и вы хотите заказать эти группы? –

+0

Да, первое появление «a» должно иметь значение «1» в результате, и оно должно оставаться таким же, как и до второго появления «a». Увеличьте значение результата на основе появления «a» в col2 –

ответ

1

Вы можете использовать курсор.

1) Create a temp table 
2) Output the result to a cursor 
3) Loop throught the cursor and update the temp table 
4) Select from the temp table. 

EDIT:

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

SELECT [Col1] 
     ,[Col2] 
     , (select count(*) from Table_1 where Col2 = 'a' and Col1 <= t1.Col1) 
    FROM [Table_1] t1 
+0

Спасибо, но я хочу выполнить это в запросе, а не с блоком PL/SQL. –

+0

. Я изменил свой ответ, если это поможет. –

+0

Спасибо, с небольшими изменениями я могу использовать его для моего требования. –

1
Declare @a table (Col1 int,Col2 Char(1)) 
Insert into @a Values (1,'a'),(2,'1'),(3,'2'),(4,'3'),(5,'a'),(6,'1'),(7,'4'),(8,'a'),(9,'2'),(10,'3'); 

;With CTE as 
(
Select *,Row_Number() OVER (Order by Col1) as rn from @a 
) 


Select a.Col1,a.Col2, 
(Select COUNT(Col2) from CTE a2 where a2.Col2=a.Col2 and a2.rn <= a.rn) 
from CTE a 
+0

Спасибо. Это помогло мне. –

1

Как примечание, в SQL Server 2012, вы можете сделать это с нарастающим итогом:

select col1, col2, 
     sum(case when col2 = 'a' then 1 else 0 end) over (order by col1) as result 
from t; 

Совокупная сумма поддерживается в других базах данных, которые поддерживают окно/аналитические функции, Что ж.

+0

Его гораздо проще с аналитической функцией. Спасибо. –

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