Oracle '파티션 기준' 및 'Row_Number' 키워드
다른 사람이 작성한 SQL 쿼리가 있는데, 어떤 기능을 하는지 알아보려고 합니다.'무엇을 주세요'가 뭔지 누가 설명 좀요?Partition By ★★★★★★★★★★★★★★★★★」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);
PARTITION BY sets.를 통해 세트( 등할 수 .segregate sets. ROW_NUMBER(), COUNT(), SUM()이 있습니다.
쿼리에서 관련 세트는 유사한 cdt.country_code, cdt.account, cdt.currency 행으로 구성됩니다.이러한 컬럼에 파티션을 분할하여 ROW_NUMBER를 적용하면 됩니다.이러한 조합/세트 상의 다른 열은 ROW_NUMBER로부터 일련 번호를 수신합니다.
아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.일부 데이터에 의한 파티션에 row_number를 붙이면 같은 번호만 생성됩니다.이는 고유성이 보장된 파티션에서 주문 기준 작업을 수행하는 것과 같습니다.를 들어,는 'GUID'와 'GUID'의 하시면 됩니다.cdt.country_code, cdt.account, cdt.currency
newid()GUID를 생성하기 때문에 이 표현으로 무엇을 기대할 수 있을까요?
select
hi,ho,
row_number() over(partition by newid() order by hi,ho)
from tbl;
...맞습니다. 모든 분할(파티셔닝되지 않고 각 행은 자체 행으로 분할됨) 행의 row_number는 모두 1로 설정됩니다.
기본적으로 고유하지 않은 열로 분할해야 합니다.ORDER BY OVER는 파티션 BY가 고유하지 않은 조합을 가질 필요가 있었습니다.그렇지 않으면 모든 row_number가 1이 됩니다.
예를 들어 다음과 같은 데이터가 있습니다.
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의 조합이 보이나요?첫 번째 3개의 행은 고유한 조합을 가지기 때문에 1로 설정되며, B행은 W가 같기 때문에 HI C행과 마찬가지로 ROW_NUMBER가 다릅니다.
그럼 , ?는 요?ORDER BY(예를 들어 B, 모든 에 row_number를 경우 할수 .이전 개발자가 단지 유사한 데이터(예: HI B, 모든 데이터는 B-W, B-W)에 row_number를 넣으려고 할 경우, 그는 다음과 같이 할 수 있습니다.
select
hi,ho,
row_number() over(partition by hi,ho)
from tbl;
Oracle)은 (SQL Server)이 ORDER BY에서는 ; "PostgresqlORDER BYon PARTION은 옵션입니다.http://www.sqlfiddle.com/ # ! 1 / 27821 / 1
select
hi,ho,
row_number() over(partition by hi,ho)
from tbl;
의 ★★★★★★★★★★★★★★★★★.ORDER BY장황하게 개발자의 일부 "Developer"를 하지 않습니다.PARTITION없 withORDER 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를 사용할 수 있습니다.newid()(SQL Server ' ' ' ) 。개발자가 있기 에 일부 에서 사용할 수 없는 유감스럽게도 일부 데이터베이스에서는PARTITION없 withORDER BY
다만, 같은 조합(위의 B-W, B-W)에 번호를 붙여야 하는 타당한 이유를 찾을 수 없습니다.데이터베이스에 중복 데이터가 있는 것처럼 보입니다.왠지 생각났어테이블에서 동일한 레코드 목록에서 하나의 고유 레코드를 가져오려면 어떻게 해야 합니까? 테이블에 고유 제약 조건이 없습니다.
ORDER BY의 컬럼 조합이 같은 파티션 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');
그럼 안녕, 호로 칸막이를 나눈 다음, 안녕, 호로 주문해유사한 데이터에 번호를 매기는 것은 의미가 없습니다.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
왜 같은 조합에 행 번호를 붙여야 하죠?트리플 A, X, 더블 B, Y, 더블 C, Z에서 무엇을 분석합니까? :-)
고유하지 않은 열에 파티션을 사용한 다음 고유하지 않은 열에 정렬하면 됩니다.예를 들면, 다음과 같이 명확하게 할 수 있습니다.
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;
PARTITION BY hiho),즉일치컬럼(ho).ORDER BY ho
출력:
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
이는 파티션 기준과 주문 기준 모두에 동일한 열이 있는 쿼리와 유사합니다.
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
선택한 문장에서 중복된 레코드를 파기하기 위한 빠른 방법으로 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;
그러면 국가 코드, 계정 및 통화별로 행 번호가 선택됩니다.따라서 국가 코드 "US", 계정 "XYZ" 및 통화 "$USD"를 가진 행은 각각 1-n부터 할당됩니다. 결과 집합에서 이러한 열의 다른 모든 조합에 대해서도 마찬가지입니다.
이 쿼리는 재미있습니다.절별 순서는 전혀 아무 것도 하지 않기 때문입니다.각 파티션의 모든 행은 동일한 국가 코드, 계정 및 통화를 가지므로 이러한 열로 정렬할 필요가 없습니다.따라서 이 쿼리에 할당된 최종 행 번호는 예측할 수 없습니다.
도움이 됐으면 좋겠는데...
오래된 스레드인 것은 알지만 파티션은 GROUP BY가 아닌 ORDER BY의 등가입니다.이 기능에서 ORDER BY는 . . . ORDER BY입니다.시퀀스 번호를 추가함으로써 용장성으로부터 일의성을 확립하는 방법일 뿐입니다.또는 함수의 별칭 열을 참조할 때 WHERE 절을 사용하여 다른 중복 레코드를 제거할 수 있습니다.단, SELECT 스테이트먼트의 DISTINT는 이 점에 있어서 같은 것을 달성할 수 있습니다.
언급URL : https://stackoverflow.com/questions/10477085/oracle-partition-by-and-row-number-keyword
'programing' 카테고리의 다른 글
| Git에서 워드프레스 사용 - 어떤 파일을 무시해야 합니까? (0) | 2023.03.01 |
|---|---|
| jAJAX 스트림을 증분적으로 읽으시겠습니까? (0) | 2023.03.01 |
| C# HttpClient 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다. (0) | 2023.03.01 |
| T-SQL에서처럼 PL/SQL에서 변수를 선언하고 사용하는 방법은 무엇입니까? (0) | 2023.03.01 |
| woocommerce 위젯 "속성별로 제품 필터링"에 사용할 수 없는 제품이 표시됨 (0) | 2023.03.01 |