2008-11-04 58 views
3

这想出回答其他用户的question(TheSoftwareJedi)当...甲骨文分析 - 分区和SQL的排序查询

假设表格如下:

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 

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

任何人都可以解释吗?

回答

5
当你在分区子句中包括ORDER

,您可以包括窗口子句是明确的。

行之间UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

这应该解决您的查询:

如果你想这些LAST_VALUES将超过所有行,你应该在您的订单通过后,包括这一点。从文档

更多细节:

如果不指定ROW或RANGE子句,窗口大小被确定为如下:

  • 如果指定了ORDER BY子句,窗口从分区中的第一行开始(UNBOUNDED PRECEDING)并以当前行(CURRENT ROW)结束。
  • 如果未指定ORDER BY子句,则窗口与在分区(无界之前)的第一行开始,并以在分区最后一行(UNBOUNDED FOLLOWING)结束。
+0

我想这不会对我的意义,这是不是默认的行为。 – ScottCher 2008-11-04 17:00:05