我有其他人写的这个查询,我试图弄清楚它是如何工作的。我对所有这些事情都有一般的了解,例如row_number()
,partition by
,pivot
,但我无法将它们全部理解在一起。
对于此查询:
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
现在,我想知道查询是如何生成输出的,即逐步执行流程。对与上述情况匹配的简单示例的解释将非常感激。提前谢谢。
答案 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
排序。