Oracle“Partition By”和“Row_Number”关键字以及pivot

Oracle“Partition By”和“Row_Number”关键字以及pivot,oracle,pivot,row-number,partition-by,Oracle,Pivot,Row Number,Partition By,我有其他人写的这个查询,我正在试图弄清楚它是如何工作的。我对所有这些事情都有大致的了解,比如行数、分区方式、轴,但我无法理解它们 对于此查询: 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)

我有其他人写的这个查询,我正在试图弄清楚它是如何工作的。我对所有这些事情都有大致的了解,比如行数、分区方式、轴,但我无法理解它们

对于此查询:

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;
这是进行上述查询的输入表:

这是查询生成的输出,根据问题是正确的:

Jenny    Ashley     Meera  Jane
Samantha Christeen  Priya  Julia
NULL     Ketty      NULL   Maria
现在,我想知道查询是如何生成输出的,即一步一步地执行流。如能提供符合上述情况的简单示例进行解释,将不胜感激。提前感谢。

在from条款之后,您有以下内容:

按名称按占用顺序选择名称、占用、分区上的行数

在上面,您可以将表数据重新打包为三列—名称、职业、行数。一旦占用列发生更改,rownumber将自动重置。输出数据如下所示:

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

因此,PIVOT函数具有基于职业的名称。输出中的每个堆栈列都是按通过第一个子查询插入的行数列排序的。

无论谁被否决,请说明原因谢谢您的时间,但我自己知道这一点,我想要的是每次pivot如何处理分区行。sql流是如何运行的。先执行什么,然后执行什么?如果你能详细地向我解释答案是如何得出的,那就太好了。@ShivamArora-执行的顺序和阿披舍克描述的一模一样。您有一个子查询,因此首先执行该子查询。结果就是这个答案中描述的输出:三列名称、职业、行号。这个输出变成了PIVOT操作的输入-这三列是如何在子查询中创建的变得无关紧要,PIVOT操作不知道,也无法知道,并且不需要知道第三列是用ROW_NUMBER函数创建的。@mathguy:当我从查询中删除按占用顺序按名称划分的ROW_NUMBER作为rownumber时,根据你的说法,答案是什么?@ShivamArora-你为什么问我?你不是已经有查询了吗?你可以自己试试!在任何情况下-如果您从子查询中删除行\号,那么PIVOT执行的分组将导致每个专业一行-因此结果将只有一行,对于每个专业,您将只获得一个名称,特别是按字母顺序排列的最后一个名称。我通过了你的测验吗?@mathguy我的目的不是问任何测验或挑战你的专业知识。我只是想要帮助,如果你能,那么非常感谢你,如果你不能,那么也谢谢你。对不起,我冒犯了你。
PIVOT 
(
  aggregate_function(column2)
  FOR column2
  IN ( expr1, expr2, ... expr_n) | subquery
)