-2
+---+------------+
| V | output |
+---+------------+
| y | 1 |
| y | 2 |
| y | 3 |
| N | 0 |
| y | 1 |
| y | 2 |
| N | 0 |
| N | 1 |
+---+------------+
+---+------------+
| V | output |
+---+------------+
| y | 1 |
| y | 2 |
| y | 3 |
| N | 0 |
| y | 1 |
| y | 2 |
| N | 0 |
| N | 1 |
+---+------------+
샘플 출력 일부는 약간 복잡,
나는 물론 내가 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
출력이
을 다음과 같다주문 정보가있는 열 (예 : 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;
이 작동 방법을 설명하는 것은 일반적으로 까다 롭습니다. 서브 쿼리를 실행하여 시퀀스 번호의 모양과 식별하려는 그룹의 차이가 일정한 이유를 확인하는 것이 좋습니다.
할 수 없습니다. SQL 테이블은 * 정렬되지 않은 * 세트를 나타냅니다. 따라서 원하는 결과를 얻으려면 순서를 지정하는 열이 필요합니다. –