当您在 OVER() 子句中对通常对排序不敏感的聚合(最小值、最大值、标准差等)进行排序时,它将成为一个运行小计。有关更彻底的治疗,请参阅 Justin Cave 对以下问题的回答。
Oracle MIN 作为分析函数 - ORDER BY 的奇怪行为?
编辑
参考这里的sqlfiddle:
http://www.sqlfiddle.com/#!4/a0f10/33
第一个查询:
SELECT B1.ST
, B1.ET
, MAX(B1.ET)
OVER(PARTITION BY B1.MAS_DIV_KEY
,B1.STN_KEY
,B1.SBSC_GUID_KEY
ORDER BY B1.ST
) AS TEST_COL
FROM AM_PROGRAM_TUNING_EVENT_TMP1 B1
ORDER BY B1.ST;
...返回
ST ET TEST_COL
March, 28 2012 11:00:00-0700 March, 28 2012 11:05:00-0700 March, 28 2012 11:05:00-0700
March, 28 2012 11:03:00-0700 March, 28 2012 11:15:00-0700 March, 28 2012 11:50:00-0700
March, 28 2012 11:03:00-0700 March, 28 2012 11:50:00-0700 March, 28 2012 11:50:00-0700
March, 28 2012 11:10:00-0700 March, 28 2012 11:30:00-0700 March, 28 2012 11:50:00-0700
March, 28 2012 11:20:00-0700 March, 28 2012 11:50:00-0700 March, 28 2012 11:50:00-0700
所以让我们分解一下……第一行是一个不同的 ST,所以到那一点的 MAX 就是该行中的任何内容。下一行,ST 不是唯一的。因此,截至该点的所有行的 MAX 不是 11:15,而是 ST 11:03 的两行的 11:50。最后两行在 11:50 之后永远不会有 ET,所以这就是我们为所有剩余行显示的内容。我们在 OVER 子句中使用了 ORDER BY,这就是我们告诉 Oracle 要做的事情。