복붙노트

[SQL] 오라클 SQL은 - 연속 값 범위를 확인

SQL

오라클 SQL은 - 연속 값 범위를 확인

여기 내 테이블은 다음과 같습니다

ID  Name      Department
1   Michael   Marketing
2   Alex      Marketing
3   Tom       Marketing
4   John      Sales
5   Brad      Marketing
6   Leo       Marketing
7   Kevin     Production

나는 ID 범위를 찾기 위해 노력하고 어디학과 = '마케팅'

Range   From   To
Range1  1      3    
Range2  5      6

어떤 도움을 주시면 감사하겠습니다.

해결법

  1. ==============================

    1.이 Tabibitosan이라는 기술을 쉽게 수행 할 수 있습니다.

    이 Tabibitosan이라는 기술을 쉽게 수행 할 수 있습니다.

    어떤이 기술하는 일은 같은 그룹에있는 행이 서로 여부를 옆 경우 해결하기 위해, 행의 전체 세트에 각 그룹의 행의 위치를 ​​비교합니다.

    예를 들어, 귀하의 예제 데이터와이 보이는 같은 :

    WITH your_table AS (SELECT 1 ID, 'Michael' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 2 ID, 'Alex' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 3 ID, 'Tom' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 4 ID, 'John' NAME, 'Sales' department FROM dual UNION ALL
                        SELECT 5 ID, 'Brad' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 6 ID, 'Leo' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 7 ID, 'Kevin' NAME, 'Production' department FROM dual)
    -- end of mimicking your table with data in it. See the SQL below:
    SELECT ID,
           NAME,
           department,
           row_number() OVER (ORDER BY ID) overall_rn,
           row_number() OVER (PARTITION BY department ORDER BY ID) department_rn,
           row_number() OVER (ORDER BY ID) - row_number() OVER (PARTITION BY department ORDER BY ID) grp
    FROM   your_table;
    
            ID NAME    DEPARTMENT OVERALL_RN DEPARTMENT_RN        GRP
    ---------- ------- ---------- ---------- ------------- ----------
             1 Michael Marketing           1             1          0
             2 Alex    Marketing           2             2          0
             3 Tom     Marketing           3             3          0
             4 John    Sales               4             1          3
             5 Brad    Marketing           5             4          1
             6 Leo     Marketing           6             5          1
             7 Kevin   Production          7             1          6
    

    여기서, I는 데이터 ID 순서합니다 (overall_rn 열) 상승의 행 번호의 집합 전체에 걸쳐 모든 행을 부여했으며, I 오름차순 다시 각 부서의 행을 행 수 (department_rn 열), 준 ID 순서.

    지금은 그 일을 한 것을, 우리는 다른 하나 (접지면 열을) 뺄 수 있습니다.

    그룹 칼럼의 숫자가 서로 옆에 부서 행에 대해 동일하게 유지하지만 간격이있을 때마다 변경하는 방법을 알 수 있습니다.

    예를 들면 마케팅 부서, 행 1-3 서로 옆에 있고 GRP = 0을 가지고 있지만 지금 다른 GRP 번호를 가지고 있으므로 4 마케팅 행 설정 전체 결과의 5 행에 실제로있다. 5 마케팅 행이 전체 세트의 6 행에 있기 때문에 우리가 서로 옆에있어 알 수 있도록, 그것은, 4 마케팅 행과 같은 GRP 번호가 있습니다.

    우리가 GRP 정보가 후에는, 부서 및 우리의 새로운 GRP 열 모두 그룹화 집계 쿼리를하고 시작과 끝 ID를 찾기 위해 최소 및 최대를 사용하는 간단한 문제입니다 :

    WITH your_table AS (SELECT 1 ID, 'Michael' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 2 ID, 'Alex' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 3 ID, 'Tom' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 4 ID, 'John' NAME, 'Sales' department FROM dual UNION ALL
                        SELECT 5 ID, 'Brad' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 6 ID, 'Leo' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 7 ID, 'Kevin' NAME, 'Production' department FROM dual)
    -- end of mimicking your table with data in it. See the SQL below:
    SELECT department,
           MIN(ID) start_id,
           MAX(ID) end_id
    FROM   (SELECT ID,
                   NAME,
                   department,
                   row_number() OVER (ORDER BY ID) - row_number() OVER (PARTITION BY department ORDER BY ID) grp
            FROM   your_table)
    GROUP BY department, grp;
    
    DEPARTMENT   START_ID     END_ID
    ---------- ---------- ----------
    Marketing           1          3
    Marketing           5          6
    Sales               4          4
    Production          7          7
    

    NB, 나는 레오와 케빈의 ID를했다, 그래서 = 6 (7 각각 8), 다음 레오와 브래드 여전히 같은에 나타나는 ID에 대한 행이 없었다 경우 ID 열의 간격이 (중요 즉 아니라는 것을 가정 한 기, 시작 ID = 5 및 종료 ID = 7.

    아이디 열 격차가 새 그룹을 나타내는으로 계산하면, 당신은 행의 전체 세트 레이블 ID를 사용할 수 있습니다합니다 (overall_rn을 caluclate하는 즉 필요 없음, 그냥 대신 id 컬럼을 사용).

    즉 쿼리가 될 것입니다 의미 :

    WITH your_table AS (SELECT 1 ID, 'Michael' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 2 ID, 'Alex' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 3 ID, 'Tom' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 4 ID, 'John' NAME, 'Sales' department FROM dual UNION ALL
                        SELECT 5 ID, 'Brad' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 7 ID, 'Leo' NAME, 'Marketing' department FROM dual UNION ALL
                        SELECT 8 ID, 'Kevin' NAME, 'Production' department FROM dual)
    -- end of mimicking your table with data in it. See the SQL below:
    SELECT department,
           MIN(ID) start_id,
           MAX(ID) end_id
    FROM   (SELECT ID,
                   NAME,
                   department,
                   ID - row_number() OVER (PARTITION BY department ORDER BY ID) grp
            FROM   your_table)
    GROUP BY department, grp;
    
    DEPARTMENT   START_ID     END_ID
    ---------- ---------- ----------
    Marketing           1          3
    Sales               4          4
    Marketing           5          5
    Marketing           7          7
    Production          8          8
    
  2. ==============================

    2.나는 현재 환경이없는하지만 당신은 이런 식으로 뭔가를 시도 할 수 있습니다

    나는 현재 환경이없는하지만 당신은 이런 식으로 뭔가를 시도 할 수 있습니다

    select * from tab1 where id in
    (select min(id) from tab1 where Department = 'Marketing'
    union 
    select max(id) from tab1 where Department = 'Marketing')
    
  3. from https://stackoverflow.com/questions/48209986/oracle-sql-identify-sequential-value-ranges by cc-by-sa and MIT license