2017-07-06 68 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'时,根据你的答案是什么? –