[英]Explanation of sql query : Rank and partition oracle
我正在使用oracle數據庫,並停留在此查詢中,我不理解它的工作方式,我刪除了所有不必要的信息,並且查詢歸結為:
select RANK () OVER (PARTITION BY A_pk ORDER BY B_pk DESC) as column from Table_C
可以解釋一下這是如何工作的嗎?
假設您有下表:
SELECT *,
ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2) AS [ROW_NUMBER],
RANK() OVER(PARTITION BY col1 ORDER BY col2) [RANK],
DENSE_RANK() OVER(PARTITION BY col1 ORDER BY col2) [DENSE_RANK]
FROM SomeTable
col1 col2 | ROW_NUMBER RANK DENSE_RANK
1 1 | 1 1 1
1 1 | 2 1 1
1 5 | 3 3 2
1 5 | 4 3 2
1 9 | 5 5 3
1 9 | 6 5 3
2 1 | 1 1 1
2 1 | 2 1 1
2 1 | 3 1 1
2 3 | 4 4 2
2 3 | 5 4 2
ROW_NUMBER:這些是window ranking
功能。 這意味着當您按某些列進行分區時,該函數將在該分區的窗口中工作。 想象一下:
col1 col2
/*------*\
|1 1|
|1 1|
|1 5| <--window 1
|1 5|
|1 9|
|1 9|
\*------*/
/*------*\
|2 1|
|2 1|
|2 1| <--another window 2
|2 3|
|2 3|
\*------*/
窗口更改時,所有設置都會重置! 因此,對於ROW_NUMBER
您col2
進行排序,並按該順序分配增量編號。 當窗口改變時,功能復位並從1
開始。
秩:
此函數將計算行數,其中col2
值小於當前行中col2
值加1。例如,在window 1
中col2 = 5
行中有2行col2 = 1
,所以2 + 1 = 3
。 對於col2 = 9
行,有4行,因此4 + 1 = 5
。
DENSE_RANK:
它與RANK
相同,但是會計算先前的DISTINCT值! 例如,對於col2 = 9
行, col2 = 1 and 5
有2個不同的值,因此2 + 1 = 3
根據A_pk
列中的值將表划分為“ windows”:
A_pk | B_pk develop | 11 develop | 7 develop | 9 develop | 8 develop | 10 *** window *** personnel | 5 personnel | 2 *** window *** sales | 3 sales | 1 sales | 4
通過B_pk desc
訂購每個“窗口”:
A_pk | B_pk develop | 11 develop | 10 develop | 9 develop | 8 develop | 7 *** window *** personnel | 5 personnel | 2 *** window *** sales | 4 sales | 3 sales | 1
通過窗口返回每行的排名(其所在的“位置”):
1 2 3 4 5 *** window *** 1 2 *** window *** 1 2 3
讓我們通過對SCOTT模式中的示例EMP表進行以下簡單查詢來理解:
SQL> SELECT empno,
2 deptno,
3 sal,
4 rank() over(partition BY deptno order by sal) rn
5 FROM emp;
EMPNO DEPTNO SAL RN
---------- ---------- ---------- ----------
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
14 rows selected.
SQL>
RANK函數是內置的分析函數,用於對一組行中的記錄進行排名。 窗口中的PARTITION BY子句將行進行分組,而ORDER BY子句則說明如何進行排名,即,每組中的哪一行將保持第一個等級,然后按該順序將下一個等級分配給下一行。
因此,在上面的示例中,行按部門分組 ,並按薪水排序 。 在每個組中,從最低工資(升序)開始分配等級。 出現平局時,等級不會增加,但是,緊隨其后的值更改的下一行將沒有連續的序列。 這就是這里發生的事情:
7654 30 1250 2
7521 30 1250 2
7844 30 1500 4
排名不是連續的,因為薪水為1250
兩行之間有1250
。 為了保持序列連續,您需要使用DENSE_RANK 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.