3

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

给定下表:

ROW_PRIORITY   COL1     COL2    COL3
0              0.1      100     <NULL>
12             <NULL>   <NULL>  3
24             0.2      <NULL>  <NULL>

和以下查询:

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);

我得到这些结果:

METRIC  ROW_PRIORITY    COL1    COL2    COL3
B            0          0.1     100     <NULL>
B           12          0.1     100     3
B           24          0.2     100     3

预期的:

METRIC  ROW_PRIORITY    COL1    COL2    COL3
B            0          0.2     100     3
B           12          0.2     100     3
B           24          0.2     100     3

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

谁能解释一下?

4

1 回答 1

5

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

如果您希望这些 LAST_VALUES 出现在所有行上,则应在 Order By 之后包含此内容:

前无界和后无界之间的行

那应该可以解决您的查询。

来自文档的更多详细信息:

如果不指定 ROW 或 RANGE 子句,则窗口大小按如下方式确定:

  • 如果指定了 ORDER BY 子句,则窗口从分区中的第一行 (UNBOUNDED PRECEDING) 开始,并以当前行 (CURRENT ROW) 结束。
  • 如果未指定 ORDER BY 子句,则窗口从分区中的第一行 (UNBOUNDED PRECEDING) 开始,并以分区中的最后一行 (UNBOUNDED FOLLOWING) 结束。
于 2008-11-04T16:58:33.613 回答