2017-07-06 64 views
-2

我有這個查詢由其他人寫的,我想弄清楚它是如何工作的。我對所有這些東西有一般的想法,例如row_number(),partition by,pivot,但我無法一起理解它們。Oracle'分區依據'和'Row_Number'關鍵字以及關鍵點

對於該查詢:

select 
    d, p, s, a 
from 
(
    select name,occupation, (ROW_NUMBER() OVER (partition by occupation order by name)) as rownumber from occupations 
) 
pivot 
(
    max(name) 
    for occupation 
    in ('Doctor' as d, 'Professor' as p, 'Singer' as s, 'Actor' as a) 
) 
order by rownumber; 

這是在其上面的查詢工作輸入表:

enter image description here

此它通過查詢生成的輸出,該輸出按正確的問題:

Jenny Ashley  Meera Jane 
Samantha Christeen Priya Julia 
NULL  Ketty  NULL Maria 

現在,我要爲k現在查詢如何產生輸出,即逐步執行流程。簡單的例子與上述情況匹配的解釋將不勝感激。提前致謝。你有以下

+0

無論誰低估,請提及原因 –

回答

0

from條款:

select name,occupation, (ROW_NUMBER() OVER (partition by occupation order by name))

以上幾乎重新疊放在三列的表中的數據 - 姓名,職業,ROWNUMBER。隨着職業欄的變化,rownumber會自動重置。輸出數據將是這樣的:

NAME     OCCUPATION   ROWNUMBER 
-------------------- -------------------- ---------- 
Jane     ACTOR    1 
Julia    ACTOR    2 
Maria    ACTOR    3 
JENNY    DOCTOR    1 <-- rownumber reset to 1 
Sammantha   DOCTOR    2 

旋轉功能讓您彙總結果&旋轉行成列。 樞軸使用的代碼是:

PIVOT 
(
    aggregate_function(column2) 
    FOR column2 
    IN (expr1, expr2, ... expr_n) | subquery 
) 

所以你PIVOT功能有名字基於OCCUPATION堆疊NAME。每個堆棧(輸出中的列)都按照第一個子查詢插入的rownumber column排序。

+0

感謝您的時間,但我自己知道這麼多,我想要的是每次樞軸如何與分區行工作。 sql流如何?什麼是先執行什麼,然後執行什麼?如果你能夠詳細解釋我將如何回答問題,那將是非常好的。 –

+0

@ShivamArora - 執行的順序和Abhishek描述的一樣。你有一個子查詢,所以首先執行。結果是本答案中描述的「輸出」:三列(名稱,職業,排名)。這個輸出成爲PIVOT操作的輸入 - 以及在子查詢中創建這三列變得無關緊要(並且PIVOT操作不知道,無法知道,也不需要知道第三列已創建與ROW_NUMBER函數)。 – mathguy

+0

@mathguy:當我從查詢中刪除'(ROW_NUMBER()OVER(按照名稱命名的分區)作爲rownumber'時,根據你的答案是什麼? –