【问题标题】:Oracle 'Partition By' and 'Row_Number' keyword along with pivotOracle 'Partition By' 和 'Row_Number' 关键字以及数据透视
【发布时间】:2017-12-10 11:45:43
【问题描述】:

我有其他人编写的此查询,我正在尝试弄清楚它是如何工作的。我对所有这些事情都有大致的了解,例如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;

这是上面查询工作的输入表:

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

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

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

【问题讨论】:

  • 投反对票的请说明原因

标签: oracle pivot row-number partition-by


【解决方案1】:

from 子句之后,您有以下内容:

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

上面实际上将您的表数据重新堆叠在三列中 - 名称、职业、行号。 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 
(
  aggregate_function(column2)
  FOR column2
  IN ( expr1, expr2, ... expr_n) | subquery
)

因此,您的 PIVOT 函数具有基于 OCCUPATION 堆叠的名称 NAME 。每个堆栈(输出中的列)由通过第一个子查询插入的rownumber column 排序。

【讨论】:

  • 感谢您的宝贵时间,但我自己知道这一点,我想要的是每次枢轴如何处理分区行。 sql流程如何。先执行什么,然后执行什么?如果您能详细说明答案是如何得出的,那就太好了。
  • @ShivamArora - 执行顺序与 Abhishek 描述的完全一样。您有一个子查询,因此首先执行。结果是本答案中描述的“输出”:三列(名称、职业、行号)。此输出成为 PIVOT 操作的输入 - 并且如何在子查询中创建这三列变得无关紧要(并且 PIVOT 操作不知道,无法知道,并且不需要知道第三列已创建使用 ROW_NUMBER 函数)。
  • @mathguy :当我从查询中删除 (ROW_NUMBER() OVER (partition by occupation order by name)) as rownumber 时,您的答案是什么?
  • @ShivamArora - 你为什么问我?你不是已经有查询了吗?你可以自己试试!在任何情况下 - 如果您从子查询中删除 row_number,那么 PIVOT 执行的分组将导致每个职业有一行 - 所以结果将只有一行,对于每个职业,您只会得到一个名称,特别是最后一个(MAX) 按字母顺序排列。我通过了你的测验吗?
  • @mathguy 我的目的不是要问任何测验或挑战你的专业知识。我只是想要帮助,如果你能,那么非常感谢你,如果你不能,那么也谢谢你。对不起,如果我冒犯了你。
猜你喜欢
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多