2013-05-15 7 views
7

다음 데이터에 대해 Oracle에서 쿼리를 작성하는 데 도움이 필요합니다. 데이터는 사람 및 날짜 필드별로 정렬됩니다.Oracle에서 필드 값이 변경 될 때 행 번호가 증가합니다.

Person  Day Flag 
    ------  --- ---- 
    person1 day1 Y 
    person1 day2 Y 
    person1 day3 Y 
    person1 day4 N 
    person1 day5 N 
    person1 day6 Y 
    person1 day7 Y 
    person1 day8 Y 

플래그 값이 변경 될 때마다 증가하는 Group_Number 열이 있어야합니다. 내 결과가 나는 그런 ROW_NUMBER와 같은 분석 함수를 사용하여 결과 이상 얻을 수있는 방법이 생각

Person  Day Flag Group_Number 
    ------  --- ---- ------------ 
    person1 day1 Y 1 
    person1 day2 Y 1 
    person1 day3 Y 1 
    person1 day4 N 2 
    person1 day5 N 2 
    person1 day6 Y 3 
    person1 day7 Y 3 
    person1 day8 Y 3 

아래와 같이 보일 것 등

답변

15

당신은 analytic functionsSUM이 (누계로 사용) 결합 할 수 있습니다 납 및 LAG :

SQL> WITH data AS (
    2   SELECT 'person1' person, 'day1' day, 'Y' flag FROM dual 
    3 UNION ALL SELECT 'person1' person, 'day2' day, 'Y' flag FROM dual 
    4 UNION ALL SELECT 'person1' person, 'day3' day, 'Y' flag FROM dual 
    5 UNION ALL SELECT 'person1' person, 'day4' day, 'N' flag FROM dual 
    6 UNION ALL SELECT 'person1' person, 'day5' day, 'N' flag FROM dual 
    7 UNION ALL SELECT 'person1' person, 'day6' day, 'Y' flag FROM dual 
    8 UNION ALL SELECT 'person1' person, 'day7' day, 'Y' flag FROM dual 
    9 UNION ALL SELECT 'person1' person, 'day8' day, 'Y' flag FROM dual 
10 ) 
11 SELECT person, DAY, flag, SUM(gap) over (PARTITION BY person 
12           ORDER BY DAY) grp 
13 FROM (SELECT person, DAY, flag, 
14     CASE WHEN flag = lag(flag) over (PARTITION BY person 
15             ORDER BY DAY) 
16      THEN 0 
17      ELSE 1 
18     END gap 
19   FROM DATA); 

PERSON DAY FLAG  GRP 
------- ---- ---- ---------- 
person1 day1 Y    1 
person1 day2 Y    1 
person1 day3 Y    1 
person1 day4 N    2 
person1 day5 N    2 
person1 day6 Y    3 
person1 day7 Y    3 
person1 day8 Y    3 
+1

+1 대단한 논리! – TechDo

+0

굉장합니다. 대단히 감사합니다! – pravi

관련 문제