簡體   English   中英

sql查詢的解釋:oracle的等級和分區

[英]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_NUMBERcol2進行排序,並按該順序分配增量編號。 當窗口改變時,功能復位並從1開始。

秩:

此函數將計算行數,其中col2值小於當前行中col2值加1。例如,在window 1col2 = 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

  1. 根據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 
  2. 通過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 
  3. 通過窗口返回每行的排名(其所在的“位置”):

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM