[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.분리 세트 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.선택하는 국가 코드, 계정, 통화 당 행 번호. 따라서, 국가 코드 "미국"과 행이 각 1-N에서 할당 된 행 번호를 얻을 것이다 "XYZ"통화 "$ USD를"계정; 같은 결과 세트에서 그 컬럼의 다른 모든 조합에 간다.
선택하는 국가 코드, 계정, 통화 당 행 번호. 따라서, 국가 코드 "미국"과 행이 각 1-N에서 할당 된 행 번호를 얻을 것이다 "XYZ"통화 "$ USD를"계정; 같은 결과 세트에서 그 컬럼의 다른 모든 조합에 간다.
order by 절이 절대적으로 아무것도하지 않기 때문에이 쿼리는 재미의 종류이다. 각 파티션의 모든 행은 같은 국가 코드가 계정, 통화, 그래서 그 열로 아무 소용 순서가 없습니다. 이 특정 쿼리에 할당 된 궁극의 행 번호 그러므로 예측할 수 있습니다.
도움이되기를 바랍니다 ...
-
==============================
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.나는이 오래된 쓰레드지만 파티션이 GROUP BY하지 ORDER BY의 당량 알고있다. 이 기능에 ORDER BY이다. . . 주문. 그것은 일련 번호를 추가하여 중복의 고유성 밖으로을 만드는 단지 방법입니다. 함수에 대한 별칭 열을 참조 할 때 아니면 WHERE 절에 의해 다른 중복 레코드를 제거 할 수있다. 그러나, SELECT 문에서 DISTINCT은 아마 그 점에서 동일한 작업을 수행하는 것입니다.
나는이 오래된 쓰레드지만 파티션이 GROUP BY하지 ORDER BY의 당량 알고있다. 이 기능에 ORDER BY이다. . . 주문. 그것은 일련 번호를 추가하여 중복의 고유성 밖으로을 만드는 단지 방법입니다. 함수에 대한 별칭 열을 참조 할 때 아니면 WHERE 절에 의해 다른 중복 레코드를 제거 할 수있다. 그러나, SELECT 문에서 DISTINCT은 아마 그 점에서 동일한 작업을 수행하는 것입니다.
from https://stackoverflow.com/questions/10477085/oracle-partition-by-and-row-number-keyword by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL의 목적이 "있는 그대로"를 키워드 무엇입니까? (0) | 2020.05.19 |
---|---|
[SQL] IN 대 큰 행 집합에 가입하세요 (0) | 2020.05.19 |
[SQL] "최선을 다하고 읽기"및 "반복 읽기"의 차이 (0) | 2020.05.19 |
[SQL] DB를 컬럼의 목록을 저장하는 방법 (0) | 2020.05.19 |
[SQL] 번호로 주문에 대한 SQL - 1,2,3,4 등 대신 1,10,11,12 (0) | 2020.05.18 |