복붙노트

[SQL] 와 'ROW_NUMBER'키워드 오라클에 의해 분할 '

SQL

와 'ROW_NUMBER'키워드 오라클에 의해 분할 '

나는 다른 사람에 의해 작성된 SQL 쿼리를 가지고 있고 나는 그것이 무엇을 알아 내려고 노력하고있어. 누군가와 ROW_NUMBER의 키워드로 파티션이 하나를 사용하려는 이유뿐만 아니라, 행동에서의 간단한 예를주고 여기 않고 설명해 주시겠습니까?

하여 파티션의 예 :

(SELECT cdt.*,
        ROW_NUMBER ()
        OVER (PARTITION BY cdt.country_code, cdt.account, cdt.currency
              ORDER BY cdt.country_code, cdt.account, cdt.currency)
           seq_no
   FROM CUSTOMER_DETAILS cdt);

나는 온라인으로 몇 가지 예를 본 적이, 그들은 비트에 너무 깊이입니다.

사전에 감사합니다!

해결법

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

    1.분리 세트 BY 파티션, 이것은 당신이 독립적으로 관련 설정에 대한 작업 (ROW_NUMBER (), COUNT (), SUM () 등)을 수행 할 수 있습니다.

    분리 세트 BY 파티션, 이것은 당신이 독립적으로 관련 설정에 대한 작업 (ROW_NUMBER (), COUNT (), SUM () 등)을 수행 할 수 있습니다.

    쿼리에 관련된 설정은 비슷 cdt.country_code, cdt.account, cdt.currency과 행으로 구성. 때 당신은 그 열을 분할하고 당신이 그들에 ROW_NUMBER을 적용합니다. 그 조합 / 세트들은 다른 열은 ROW_NUMBER에서 일련 번호를 받게됩니다

    그러나 쿼리는 몇 가지 고유 한 데이터로 분할하고 그 위에 ROW_NUMBER를 넣어 경우, 그냥 같은 번호를 생성합니다, 재미입니다. 당신은 고유 보장 파티션에 의해 주문을 할 것입니다. 예, cdt.country_code, cdt.account, cdt.currency의 독특한 조합으로 GUID 생각

    NEWID ()는 GUID는, 그래서 당신은이 표현에서 무엇을 기대해야 생산?

    select
       hi,ho,
       row_number() over(partition by newid() order by hi,ho)
    from tbl;
    

    ... 오른쪽, 모든 행 'row_numbers 1에 대한 모든 설정되어 있습니다 (어느 것도, 모든 행이 자신의 행에 분할되어 분할되지 않은) 분할

    기본적으로, 당신은 고유하지 않은 열을 분할해야한다. OVER에서 ORDER BY 그렇지 않으면 모든 row_numbers 1이 될 것이다, 고유하지 않은 조합을 위해 파티션 BY 필요

    예를 들어, 데이타입니다 :

    create table tbl(hi varchar, ho varchar);
    
    insert into tbl values
    ('A','X'),
    ('A','Y'),
    ('A','Z'),
    ('B','W'),
    ('B','W'),
    ('C','L'),
    ('C','L');
    

    그런 다음이 쿼리와 유사합니다 :

    select
       hi,ho,
       row_number() over(partition by hi,ho order by hi,ho)
    from tbl;
    

    그 출력은 무엇을 할 것인가?

    HI  HO  COLUMN_2
    A   X   1
    A   Y   1
    A   Z   1
    B   W   1
    B   W   2
    C   L   1
    C   L   2
    

    당신은 HI HO의 너를 조합을 볼 수? 처음 세 행 독특한 조합, 따라서 그것들이 1로 설정되어 있으며, 상기 B 행 마찬가지로 C HI 행과 같은 W, 따라서 다른 ROW_NUMBERS을 갖는다.

    이제, 왜이 필요 BY 순서는? 이전 개발자가 단순히 유사한 데이터에 ROW_NUMBER를 넣고 싶은 경우에, 그는 단지 이렇게 할 수 있습니다 (예를 들어, HI B를, 모든 데이터는 B-W, B-W는)

    select
       hi,ho,
       row_number() over(partition by hi,ho)
    from tbl;
    

    그러나 슬프게도, 오라클 (및 SQL Server도)없는 ORDER BY와 파티션을 허용하지 않습니다; PostgreSQL을에있는 반면, 파티션에 주문 BY는 선택 사항입니다 : http://www.sqlfiddle.com/#!1/27821/1

    select
       hi,ho,
       row_number() over(partition by hi,ho)
    from tbl;
    

    비트 중복 때문이 아니라 이전 개발자의 잘못의 파티션 모양에 BY 주문, 일부 데이터베이스 그냥 아무 ORDER BY와 PARTITION을 허용하지 않습니다, 그는하지 수 찾기에 정렬 할 수있는 좋은 후보 열 수 있습니다. 열 BY 열 및 ORDER BY 모두 파티션이 같은 경우 단지 ORDER BY를 제거 할 수 있지만 일부 데이터베이스는 그것을 허용하지 않기 때문에, 당신은이 작업을 수행 할 수 있습니다

    SELECT cdt.*,
            ROW_NUMBER ()
            OVER (PARTITION BY cdt.country_code, cdt.account, cdt.currency
                  ORDER BY newid())
               seq_no
       FROM CUSTOMER_DETAILS cdt
    

    당신은 유사한 데이터를 정렬에 사용할 수있는 좋은 열을 찾을 수 없습니다? 당신은뿐만 아니라 종류의 임의에, 분할 된 데이터는 어차피 같은 값을 가질 수 있습니다. 당신은 예를 들어 GUID를 사용할 수 있습니다 (당신은 SQL Server에 대한) (NEWID 사용). 그 이전 개발자가 만든 동일한 출력을 가지고 그래서, 일부 데이터베이스는 더 주문 BY와 PARTITION을 허용하지 않는 것은 불행한 일이다

    정말로, 그것은 나를 회피한다 나는 같은 조합 (B-W, 위의 예에서 B-W)에 숫자를 넣어 좋은 이유를 찾을 수 없습니다. 그것은 데이터베이스 가진 중복 데이터의 인상을주고있다. 테이블에서 같은 레코드 목록에서 하나 개의 고유 한 기록을 얻을 방법 : 어떻게 든이를 생각 나게? 테이블 없음 고유 제약

    정말 외모가 ORDER BY와 컬럼의 동일한 조합에 의해 파티션을 보는 신비한 쉽게 코드의이 의도를 추론 할 수 없습니다.

    라이브 테스트 : http://www.sqlfiddle.com/#!3/27821/6

    dbaseman도 발견했습니다하지만,이 같은 열에 파티션 순서에 쓸모가 없어요.

    이 같은 데이터 세트를 가지고 :

    create table tbl(hi varchar, ho varchar);
    
    insert into tbl values
    ('A','X'),
    ('A','X'),
    ('A','X'),
    ('B','Y'),
    ('B','Y'),
    ('C','Z'),
    ('C','Z');
    

    그런 다음, 안녕하세요하여 PARTITION 호; 다음은 호, 인사에 의해 주문하십시오. 유사한 데이터를 번호 아무 의미가 없습니다 :-) http://www.sqlfiddle.com/#!3/29ab8/3

    select
       hi,ho,
       row_number() over(partition by hi,ho order by hi,ho) as nr
    from tbl;
    

    산출:

    HI  HO  ROW_QUERY_A
    A   X   1
    A   X   2
    A   X   3
    B   Y   1
    B   Y   2
    C   Z   1
    C   Z   2
    

    보다? 왜 필요 같은 조합에 행 번호를 넣어? 당신은 무엇을 더블 C, Z에 트리플 더블 B에 X, Y를 분석? :-)

    당신은, 고유하지 않은 열을 사용하는 파티션에 다음 종류의 고유하지 않은 컬럼에 (들)의 독특한 - 보내고 열이 필요합니다. 예 좀 더 명확하게합니다 :

    create table tbl(hi varchar, ho varchar);
    
    insert into tbl values
    ('A','D'),
    ('A','E'),
    ('A','F'),
    ('B','F'),
    ('B','E'),
    ('C','E'),
    ('C','D');
    
    select
       hi,ho,
       row_number() over(partition by hi order by ho) as nr
    from tbl;
    

    안녕하세요 BY 파티션은 각 분할 된 열, 당신은 호에 의해 고유의 열 (호), ORDER에 주문, 비 고유 한 열에서 작동

    산출:

    HI  HO  NR
    A   D   1
    A   E   2
    A   F   3
    B   E   1
    B   F   2
    C   D   1
    C   E   2
    

    이 데이터 세트는 더 의미가 있습니다

    라이브 테스트 : http://www.sqlfiddle.com/#!3/d0b44/1

    그리고이 두 파티션 BY와 ORDER BY에 같은 열이 쿼리와 유사합니다 :

    select
       hi,ho,
       row_number() over(partition by hi,ho order by hi,ho) as nr
    from tbl;
    

    그리고 이것은 출력은 다음과 같습니다

    HI  HO  NR
    A   D   1
    A   E   1
    A   F   1
    B   E   1
    B   F   1
    C   D   1
    C   E   1
    

    보다? 말이되지 않는다?

    라이브 테스트 : http://www.sqlfiddle.com/#!3/d0b44/3

    마지막으로이 오른쪽 쿼리 수 있습니다 :

    SELECT cdt.*,
         ROW_NUMBER ()
         OVER (PARTITION BY cdt.country_code, cdt.account -- removed: cdt.currency
               ORDER BY 
                   -- removed: cdt.country_code, cdt.account, 
                   cdt.currency) -- keep
            seq_no
    FROM CUSTOMER_DETAILS cdt
    
  2. ==============================

    2.선택하는 국가 코드, 계정, 통화 당 행 번호. 따라서, 국가 코드 "미국"과 행이 각 1-N에서 할당 된 행 번호를 얻을 것이다 "XYZ"통화 "$ USD를"계정; 같은 결과 세트에서 그 컬럼의 다른 모든 조합에 간다.

    선택하는 국가 코드, 계정, 통화 당 행 번호. 따라서, 국가 코드 "미국"과 행이 각 1-N에서 할당 된 행 번호를 얻을 것이다 "XYZ"통화 "$ USD를"계정; 같은 결과 세트에서 그 컬럼의 다른 모든 조합에 간다.

    order by 절이 절대적으로 아무것도하지 않기 때문에이 쿼리는 재미의 종류이다. 각 파티션의 모든 행은 같은 국가 코드가 계정, 통화, 그래서 그 열로 아무 소용 순서가 없습니다. 이 특정 쿼리에 할당 된 궁극의 행 번호 그러므로 예측할 수 있습니다.

    도움이되기를 바랍니다 ...

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

    3.나는 종종 내 SELECT 문에서 중복 레코드를 삭제하는 빠른 방법으로 ROW_NUMBER ()를 사용합니다. 그냥 where 절을 추가합니다. 같은 뭔가 ...

    나는 종종 내 SELECT 문에서 중복 레코드를 삭제하는 빠른 방법으로 ROW_NUMBER ()를 사용합니다. 그냥 where 절을 추가합니다. 같은 뭔가 ...

    select a,b,rn 
      from (select a, b, row_number() over (partition by a,b order by a,b) as rn           
              from table) 
     where rn=1;
    
  4. ==============================

    4.나는이 오래된 쓰레드지만 파티션이 GROUP BY하지 ORDER BY의 당량 알고있다. 이 기능에 ORDER BY이다. . . 주문. 그것은 일련 번호를 추가하여 중복의 고유성 밖으로을 만드는 단지 방법입니다. 함수에 대한 별칭 열을 참조 할 때 아니면 WHERE 절에 의해 다른 중복 레코드를 제거 할 수있다. 그러나, SELECT 문에서 DISTINCT은 아마 그 점에서 동일한 작업을 수행하는 것입니다.

    나는이 오래된 쓰레드지만 파티션이 GROUP BY하지 ORDER BY의 당량 알고있다. 이 기능에 ORDER BY이다. . . 주문. 그것은 일련 번호를 추가하여 중복의 고유성 밖으로을 만드는 단지 방법입니다. 함수에 대한 별칭 열을 참조 할 때 아니면 WHERE 절에 의해 다른 중복 레코드를 제거 할 수있다. 그러나, SELECT 문에서 DISTINCT은 아마 그 점에서 동일한 작업을 수행하는 것입니다.

  5. from https://stackoverflow.com/questions/10477085/oracle-partition-by-and-row-number-keyword by cc-by-sa and MIT license