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

샘플 출력 일부는 약간 복잡,

나는 물론 내가 id 컬럼 1에서 시작하여 어느 틈없이 continuosly 진행된다고 가정 문제의 해결을위한 SQL recursive query을 사용하는 것이 바람직 방법입니다 . 더 복잡한 경우, ROW_NUMBER() 함수는 id 필드 외에 추가 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; 

이 작동 방법을 설명하는 것은 일반적으로 까다 롭습니다. 서브 쿼리를 실행하여 시퀀스 번호의 모양과 식별하려는 그룹의 차이가 일정한 이유를 확인하는 것이 좋습니다.