Oracle' Partition By'和' Row_Number'关键字以及枢轴

时间:2017-07-06 12:50:37

标签: oracle pivot row-number partition-by

我有其他人写的这个查询,我试图弄清楚它是如何工作的。我对所有这些事情都有一般的了解,例如row_number()partition bypivot,但我无法将它们全部理解在一起。

对于此查询:

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

现在,我想知道查询是如何生成输出的,即逐步执行流程。对与上述情况匹配的简单示例的解释将非常感激。提前谢谢。

1 个答案:

答案 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

透视功能可让您汇总结果&amp;将行旋转到列中。 枢轴使用代码是:

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

因此,PIVOT函数的名称已根据NAME堆叠OCCUPATION。每个堆栈(输出中的列)按照第一个子查询插入的rownumber column排序。