2013-05-15 13 views
7

Potrzebuję pomocy w pisaniu zapytania w Oracle dla następujących danych. Dane są sortowane według pól Osoba i Dzień.zwiększa numer wiersza, gdy wartość zmian pola w 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 

Potrzebuję kolumna Group_Number, która zwiększa się przy każdej zmianie wartości flagi. Mój wynik powinien wyglądać jak poniżej

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 

myślę, że istnieje sposób, aby uzyskać powyżej wyniku korzystania z funkcji analitycznych, takich jak ROW_NUMBER, LEAD itp

Odpowiedz

15

Można połączyć analytic functionsSUM (używane jako bieżąca suma) i 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 Świetna logika! – TechDo

+0

Awesome. Dziękuję bardzo! – pravi

Powiązane problemy