Oracle Analytics - sql查询的分区和排序

Sco*_*her 3 oracle analytic-functions

在回答另一个用户的问题(TheSoftwareJedi)时出现了这个问题 ......

鉴于下表:

ROW_PRIORITY   COL1     COL2    COL3
0              0.1      100     <NULL>
12             <NULL>   <NULL>  3
24             0.2      <NULL>  <NULL>
Run Code Online (Sandbox Code Playgroud)

以及以下查询:

select  'B' METRIC, ROW_PRIORITY,
        last_value(col1 ignore nulls) over (ORDER BY ROW_PRIORITY) col1,
        last_value(col2 ignore nulls) over (ORDER BY ROW_PRIORITY) col2,
        last_value(col3 ignore nulls) over (ORDER BY ROW_PRIORITY) col3
from    (SELECT * FROM ZTEST);
Run Code Online (Sandbox Code Playgroud)

我得到这些结果:

METRIC  ROW_PRIORITY    COL1    COL2    COL3
B            0          0.1     100     <NULL>
B           12          0.1     100     3
B           24          0.2     100     3
Run Code Online (Sandbox Code Playgroud)

预期:

METRIC  ROW_PRIORITY    COL1    COL2    COL3
B            0          0.2     100     3
B           12          0.2     100     3
B           24          0.2     100     3
Run Code Online (Sandbox Code Playgroud)

问题当然是,为什么我不能在col1等中获得每行优先级0.2?LAST_VALUE应首先执行ORDER BY,然后从分区中选择最后一个值.在上面的查询的情况下,分区是整个记录集,所以我将看到我上面的预期结果.

谁能解释一下?

小智 5

当您在Partitioning子句中包含ORDER by时,可以包含一个显式的窗口子句.

如果您希望这些LAST_VALUES遍布所有行,则应在Order By之后包含此行:

无界先行与无界之间的行

这应该可以解决您的疑问.

来自文档的更多细节:

如果未指定ROW或RANGE子句,则窗口大小确定如下:

  • 如果指定了ORDER BY子句,则窗口以分区中的第一行(UNBOUNDED PRECEDING)开始,并以当前行(CURRENT ROW)结束.
  • 如果未指定ORDER BY子句,则窗口以分区中的第一行(UNBOUNDED PRECEDING)开始,并以分区中的最后一行结束(UNBOUNDED FOLLOWING).