2016-09-20 2 views
-2
+---+------------+ 
| V | output  | 
+---+------------+ 
| y |   1 | 
| y |   2 | 
| y |   3 | 
| N |   0 | 
| y |   1 | 
| y |   2 | 
| N |   0 | 
| N |   1 | 
+---+------------+ 
+3

Вы не можете. Таблицы SQL представляют собой * неупорядоченные * наборы. Итак, вам нужен столбец, который задает порядок, чтобы получить желаемый результат. –

ответ

0

Ваш выход образец как некоторые немного сложным,

я предпочел использовать SQL recursive query для решения вашей проблемы Конечно я полагаю, что колонка идентификатор, начиная с 1 и идет непрерывно без зазора , В более сложном случае, функция row_number() должна быть прибавлено идентификатор поля и присоединиться должны быть установлены на rownumbers

Я надеюсь, что это помогает,

--create table bool(id int identity(1,1), bool char(1)) 
--insert into bool values ('Y'),('N'),('Y'),('Y'),('Y'),('N'),('Y'),('N'),('N'),('Y'),('Y'),('Y'),('Y'),('Y'),('N'),('Y'),('Y') 

;with cte as (
    select id, bool curr, bool pre, 1 output from bool where id = 1 
    union all 
    select 
     bool.id, bool.bool curr, cte.curr, 
     case when bool.bool = cte.curr then cte.output + 1 else case when bool.bool = 'Y' then 1 else 0 end end 
    from cte 
    inner join bool on bool.id = cte.id + 1 
) 
select * from cte 

Выход следующим

enter image description here

3

Позвольте мне предположить, что у вас есть столбец (скажем, id), который имеет информацию для заказа. Затем вы хотите идентифицировать группы «Y» и «N», которые появляются вместе, а затем перечисляют их.

Вы можете сделать это, используя разницу чисел строки трюк:

select t.v, 
     row_number() over (partition by v, seqnum_id - seqnum_vid order by id) as output 
from (select t.*, 
      row_number() over (order by id) as seqnum_id, 
      row_number() over (partition v by order by id) as seqnum_vid 
     from t 
    ) t; 

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

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