[SQL] RANK ()와 DENSE_RANK () 오라클 함수의 차이점은 무엇입니까?
SQLRANK ()와 DENSE_RANK () 오라클 함수의 차이점은 무엇입니까?
RANK ()와 DENSE_RANK () 함수의 차이점은 무엇입니까? 어떻게 다음 emptbl 테이블에서 n 번째 월급을 찾는 방법은?
DEPTNO EMPNAME SAL
------------------------------
10 rrr 10000.00
11 nnn 20000.00
11 mmm 5000.00
12 kkk 30000.00
10 fff 40000.00
10 ddd 40000.00
10 bbb 50000.00
10 ccc 50000.00
테이블에 데이터가 널 (null)을 가진 경우 나 n 번째 월급을 찾으려면, 어떤 일이 일어날 것인가?
해결법
-
==============================
1.RANK는 당신에게 당신의 주문 파티션 내에서 순위를 제공합니다. 넥타이는 다음 순위 (들)와 같은 순위를 할당 건너 뜁니다. 당신이 순위 2에서 3 개 항목이 경우에 따라서, 나열된 다음 순위 5 위를 기록된다.
RANK는 당신에게 당신의 주문 파티션 내에서 순위를 제공합니다. 넥타이는 다음 순위 (들)와 같은 순위를 할당 건너 뜁니다. 당신이 순위 2에서 3 개 항목이 경우에 따라서, 나열된 다음 순위 5 위를 기록된다.
DENSE_RANK는 다시 주문 파티션 내에서 당신에게 순위를 제공하지만 순위는 연속이다. 어떤 계급 여러 항목 순위가있는 경우 스킵되지 않습니다.
널 (null)에 관해서는, ORDER BY 절에 따라 달라집니다. 여기에 당신이 어떻게되는지 놀 수있는 간단한 테스트 스크립트는 다음과 같습니다
with q as ( select 10 deptno, 'rrr' empname, 10000.00 sal from dual union all select 11, 'nnn', 20000.00 from dual union all select 11, 'mmm', 5000.00 from dual union all select 12, 'kkk', 30000 from dual union all select 10, 'fff', 40000 from dual union all select 10, 'ddd', 40000 from dual union all select 10, 'bbb', 50000 from dual union all select 10, 'xxx', null from dual union all select 10, 'ccc', 50000 from dual) select empname, deptno, sal , rank() over (partition by deptno order by sal nulls first) r , dense_rank() over (partition by deptno order by sal nulls first) dr1 , dense_rank() over (partition by deptno order by sal nulls last) dr2 from q; EMP DEPTNO SAL R DR1 DR2 --- ---------- ---------- ---------- ---------- ---------- xxx 10 1 1 4 rrr 10 10000 2 2 1 fff 10 40000 3 3 2 ddd 10 40000 3 3 2 ccc 10 50000 5 4 3 bbb 10 50000 5 4 3 mmm 11 5000 1 1 1 nnn 11 20000 2 2 2 kkk 12 30000 1 1 1 9 rows selected.
여기에 좋은 설명하고 몇 가지 예에 대한 링크입니다.
-
==============================
2.여기에이 문서 멋지게 설명합니다. 기본적으로, 당신은 그것을 볼 수 있습니다 :
여기에이 문서 멋지게 설명합니다. 기본적으로, 당신은 그것을 볼 수 있습니다 :
CREATE TABLE t AS SELECT 'a' v FROM dual UNION ALL SELECT 'a' FROM dual UNION ALL SELECT 'a' FROM dual UNION ALL SELECT 'b' FROM dual UNION ALL SELECT 'c' FROM dual UNION ALL SELECT 'c' FROM dual UNION ALL SELECT 'd' FROM dual UNION ALL SELECT 'e' FROM dual; SELECT v, ROW_NUMBER() OVER (ORDER BY v) row_number, RANK() OVER (ORDER BY v) rank, DENSE_RANK() OVER (ORDER BY v) dense_rank FROM t ORDER BY v;
위의 의지 수율 :
+---+------------+------+------------+ | V | ROW_NUMBER | RANK | DENSE_RANK | +---+------------+------+------------+ | a | 1 | 1 | 1 | | a | 2 | 1 | 1 | | a | 3 | 1 | 1 | | b | 4 | 4 | 2 | | c | 5 | 5 | 3 | | c | 6 | 5 | 3 | | d | 7 | 7 | 4 | | e | 8 | 8 | 5 | +---+------------+------+------------+
즉
-
==============================
3.
SELECT empno, deptno, sal, RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank" FROM emp; EMPNO DEPTNO SAL rank ---------- ---------- ---------- ---------- 7934 10 1300 1 7782 10 2450 2 7839 10 5000 3 7369 20 800 1 7876 20 1100 2 7566 20 2975 3 7788 20 3000 4 7902 20 3000 4 7900 30 950 1 7654 30 1250 2 7521 30 1250 2 7844 30 1500 4 7499 30 1600 5 7698 30 2850 6 SELECT empno, deptno, sal, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank" FROM emp; EMPNO DEPTNO SAL rank ---------- ---------- ---------- ---------- 7934 10 1300 1 7782 10 2450 2 7839 10 5000 3 7369 20 800 1 7876 20 1100 2 7566 20 2975 3 7788 20 3000 4 7902 20 3000 4 7900 30 950 1 7654 30 1250 2 7521 30 1250 2 7844 30 1500 3 7499 30 1600 4 7698 30 2850 5
-
==============================
4.순위 () : 행의 그룹 내에서 레코드 순위를 매기는 데 사용됩니다.
순위 () : 행의 그룹 내에서 레코드 순위를 매기는 데 사용됩니다.
DENSE_RANK () 다음 DENSE_RANK 함수가 연속 순위를 할당한다는 점을 제외하고 RANK 함수와 같은 역할을합니다.
쿼리 -
select ENAME,SAL,RANK() over (order by SAL) RANK from EMP;
출력 -
+--------+------+------+ | ENAME | SAL | RANK | +--------+------+------+ | SMITH | 800 | 1 | | JAMES | 950 | 2 | | ADAMS | 1100 | 3 | | MARTIN | 1250 | 4 | | WARD | 1250 | 4 | | TURNER | 1500 | 6 | +--------+------+------+
쿼리 -
select ENAME,SAL,dense_rank() over (order by SAL) DEN_RANK from EMP;
출력 -
+--------+------+-----------+ | ENAME | SAL | DEN_RANK | +--------+------+-----------+ | SMITH | 800 | 1 | | JAMES | 950 | 2 | | ADAMS | 1100 | 3 | | MARTIN | 1250 | 4 | | WARD | 1250 | 4 | | TURNER | 1500 | 5 | +--------+------+-----------+
-
==============================
5.
select empno ,salary ,row_number() over(order by salary desc) as Serial ,Rank() over(order by salary desc) as rank ,dense_rank() over(order by salary desc) as denseRank from emp ;
ROW_NUMBER () -> 일련 번호를 생성하는 데 사용
DENSE_RANK ()는 연속 순위를 줄 것이다하지만 순위는 순위의 충돌의 경우에 순위를 건너 뜁니다.
-
==============================
6.랭크 () 및 DENSE_RANK 유일한 차이점은 () 함수는 "타이"로되는 경우에; 즉, 다중 세트의 값이 동일한 순위를 가질 경우이다. DENSE_RANK ()가있는 값으로 연속 된 순위를 지정하는 반면 이러한 경우, RANK ()는 (a 동점이있을 때의 값의 순위를 정수 사이의 갭의 결과로) 집합의 값에 대한 비 연속 "랭크"를 할당 할 세트 (그래서 타이의 경우에 값 순위 정수 간의 간격이 없어야한다).
랭크 () 및 DENSE_RANK 유일한 차이점은 () 함수는 "타이"로되는 경우에; 즉, 다중 세트의 값이 동일한 순위를 가질 경우이다. DENSE_RANK ()가있는 값으로 연속 된 순위를 지정하는 반면 이러한 경우, RANK ()는 (a 동점이있을 때의 값의 순위를 정수 사이의 갭의 결과로) 집합의 값에 대한 비 연속 "랭크"를 할당 할 세트 (그래서 타이의 경우에 값 순위 정수 간의 간격이 없어야한다).
예를 들어, 세트 {25, 25, 50, 75, 75, 100}을 고려한다. 이러한 세트의 경우, RANK ()가 반환 {1, 1, 3, 4, 4, 6} (숫자 2 및도 5는 생략한다), 반면 DENSE_RANK는 (), 1,1,2,3 {반환 3,4}.
-
==============================
7.랭크 () SQL 함수 값들의 순서화 된 세트 그러나 이전 등급 특정 행 ROW_NUMBER 후 다음 랭크에서의 데이터의 순위를 생성한다. 한편, DENSE_RANK () SQL 함수는 다음 번호 대신 발생 ROW_NUMBER를 생성한다. 아래의 개념을 명확히 할 SQL의 예입니다 :
랭크 () SQL 함수 값들의 순서화 된 세트 그러나 이전 등급 특정 행 ROW_NUMBER 후 다음 랭크에서의 데이터의 순위를 생성한다. 한편, DENSE_RANK () SQL 함수는 다음 번호 대신 발생 ROW_NUMBER를 생성한다. 아래의 개념을 명확히 할 SQL의 예입니다 :
Select ROW_NUMBER() over (order by Salary) as RowNum, Salary, RANK() over (order by Salary) as Rnk, DENSE_RANK() over (order by Salary) as DenseRnk from ( Select 1000 as Salary union all Select 1000 as Salary union all Select 1000 as Salary union all Select 2000 as Salary union all Select 3000 as Salary union all Select 3000 as Salary union all Select 8000 as Salary union all Select 9000 as Salary) A
그것은 다음과 같은 출력을 생성합니다 :
---------------------------- RowNum Salary Rnk DenseRnk ---------------------------- 1 1000 1 1 2 1000 1 1 3 1000 1 1 4 2000 4 2 5 3000 5 3 6 3000 5 3 7 8000 7 4 8 9000 8 5
-
==============================
8.순위와 DENSE_RANK는 분할 된 데이터 집합의 순위를 제공합니다.
순위와 DENSE_RANK는 분할 된 데이터 집합의 순위를 제공합니다.
순위는 () : 그것은 당신에게 연속 정수 번호를 제공하지 않습니다.
DENSE_RANK는 () : 그것은 당신에게 연속 정수 번호를 제공합니다.
그것은 ROW_NUMBER 고려로 상기 사진에서 10,008 지퍼의 랭크는 랭크 () 함수에 의해 2 DENSE_RANK () 함수 (24)이다.
from https://stackoverflow.com/questions/11183572/whats-the-difference-between-rank-and-dense-rank-functions-in-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 2008 SQL 서버를 사용하는 경우 조건이 어떻게 여러 CASE해야합니까? (0) | 2020.04.17 |
---|---|
[SQL] 동적 정렬 SQL 저장 프로 시저 내에서 (0) | 2020.04.17 |
[SQL] 포스트 그레스에서 재설정 자동 증가 카운터 (0) | 2020.04.17 |
[SQL] 방법에 2008 SQL Server를 사용하여 해제 IDENTITY_INSERT를 켭니다? (0) | 2020.04.17 |
[SQL] PostgreSQL의를 사용하여 동일한 쿼리에서 여러 행을 업데이트 (0) | 2020.04.17 |