복붙노트

[SQL] 서열 값에 의해 그룹

SQL

서열 값에 의해 그룹

나는이 같은 일부 테이블이

row chequeNo
 1     15
 2     19
 3     20
 4     35
 5     16

나는이 같은 결과를 얻을 필요

row  from   to    
 1    15    16     
 2    19    20    
 3    35    35

그래서 값이 어떤 중단없이 연속 될 것이다 chequeNo 그룹이 필요합니다. chequeNo 고유 열입니다. 내가 선택 쿼리를 제외한 모든 SQL 구조를 만들 수없는 권한을 가지고 있기 때문에 또한 쿼리를 선택 SQL 하나를 수행해야합니다.

그래서 가능할까요?

어떤 도움 감사 드리겠습니다

해결법

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

    1.당신은 Jyuuzou의 기술을 앉아서 사용할 수 있습니다 여기 Tabibitosan라고 :

    당신은 Jyuuzou의 기술을 앉아서 사용할 수 있습니다 여기 Tabibitosan라고 :

    SQL> create table mytable (id,chequeno)
      2  as
      3  select 1, 15 from dual union all
      4  select 2, 19 from dual union all
      5  select 3, 20 from dual union all
      6  select 4, 35 from dual union all
      7  select 5, 16 from dual
      8  /
    
    Table created.
    
    SQL> with tabibitosan as
      2  ( select chequeno
      3         , chequeno - row_number() over (order by chequeno) grp
      4      from mytable
      5  )
      6  select row_number() over (order by grp) "row"
      7       , min(chequeno) "from"
      8       , max(chequeno) "to"
      9    from tabibitosan
     10   group by grp
     11  /
    
           row       from         to
    ---------- ---------- ----------
             1         15         16
             2         19         20
             3         35         35
    
    3 rows selected.
    

    문안 인사, 롭.

  2. ==============================

    2.이것은 오라클 (10)와 함께 작동합니다 (오라클 만 11 테스트)

    이것은 오라클 (10)와 함께 작동합니다 (오라클 만 11 테스트)

    select group_nr + 1,
           min(chequeno) as start_value,
           max(chequeno) as end_value
    from (
      select chequeno,
             sum(group_change_flag) over (order by rn) as group_nr
      from (
        select row_number() over (order by chequeno) as rn,
               chequeno, 
               case 
                 when chequeno - lag(chequeno,1,chequeno) over (order by chequeno) <= 1 then 0 
                 else 1
               end as group_change_flag
        from foo
      ) t1
    ) t2
    group by group_nr
    order by group_nr
    

    (이 작업을해야 기능을 윈도 표준 SQL을 지원하는 모든 DBMS, 예를 들어, PostgreSQL을, DB2, 2012 SQL 서버)

  3. ==============================

    3.여기에 "일반 바닐라"접근 방식은 다음과 같습니다

    여기에 "일반 바닐라"접근 방식은 다음과 같습니다

    SELECT T1.chequeNo, T2.chequeNo
    FROM Table1 AS T1 INNER JOIN Table1 AS T2 ON T2.chequeNo >= T1.chequeNo
    WHERE
    NOT EXISTS (SELECT T0.chequeNo FROM Table1 T0 WHERE T0.chequeNo IN ((T1.chequeNo-1), (T2.chequeNo+1)))
    AND (SELECT COUNT(*) FROM Table1 T0 WHERE T0.chequeNo BETWEEN T1.chequeNo AND T2.chequeNo)=(T2.chequeNo - T1.chequeNo + 1)
    ORDER BY 1,2
    

    이 대용량 데이터 세트에 대한 너무 비효율적 있으면 알려 주시기 바랍니다.

  4. ==============================

    4.

    CREATE TABLE YOUR_TABLE (
        chequeNo NUMBER PRIMARY KEY
    );
    
    INSERT INTO YOUR_TABLE VALUES (15);
    INSERT INTO YOUR_TABLE VALUES (19);
    INSERT INTO YOUR_TABLE VALUES (20);
    INSERT INTO YOUR_TABLE VALUES (35);
    INSERT INTO YOUR_TABLE VALUES (16);
    
    SELECT T1.chequeNo "from", T2.chequeNo "to"
    FROM
        (
            SELECT chequeNo, ROW_NUMBER() OVER (ORDER BY chequeNo) RN
            FROM (
                SELECT chequeNo, LAG(chequeNo) OVER (ORDER BY chequeNo) PREV
                FROM YOUR_TABLE
            )
            WHERE PREV IS NULL OR chequeNo > PREV + 1
        ) T1
        JOIN
        (
            SELECT chequeNo, ROW_NUMBER() OVER (ORDER BY chequeNo) RN
            FROM (
                SELECT chequeNo, LEAD(chequeNo) OVER (ORDER BY chequeNo) NEXT
                FROM YOUR_TABLE
            )
            WHERE NEXT IS NULL OR chequeNo < NEXT - 1
        ) T2
        USING (RN);
    

    결과:

    from                   to                     
    ---------------------- ---------------------- 
    15                     16                     
    19                     20                     
    35                     35                     
    

    우리는 약간까지 가지 양념을하면 ...

    INSERT INTO YOUR_TABLE VALUES (17);
    INSERT INTO YOUR_TABLE VALUES (18);
    

    ... 우리가 얻을 :

    from                   to                     
    ---------------------- ---------------------- 
    15                     20                     
    35                     35                     
    
  5. from https://stackoverflow.com/questions/9977371/group-by-values-that-are-in-sequence by cc-by-sa and MIT license