2013-05-15 27 views
7

Tôi cần trợ giúp bằng văn bản truy vấn trong Oracle cho dữ liệu sau. Dữ liệu được sắp xếp theo trường Người và Ngày.số hàng tăng khi giá trị của thay đổi trường trong 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 

Tôi cần có cột Group_Number được tăng lên bất cứ khi nào giá trị cờ thay đổi. Kết quả của tôi sẽ giống như dưới đây

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 

Tôi nghĩ rằng đó là cách để có được kết quả trên sử dụng chức năng phân tích như ROW_NUMBER, LEAD, vv

Trả lời

15

Bạn có thể kết hợp analytic functionsSUM (sử dụng như một tổng chạy) và 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 Tuyệt vời logic! – TechDo

+0

Tuyệt vời.Cảm ơn bạn rất nhiều! – pravi

Các vấn đề liên quan