我正在尝试对示例数据运行分区查询。如果我删除ORDER BY子句,它会给我不同的结果。不同结果的原因是什么。请检查以下链接。
http://www.sqlfiddle.com/#!4/a0f10/5
SELECT 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;
SELECT MAX(B1.ET) OVER(PARTITION BY B1.MAS_DIV_KEY,B1.STN_KEY,B1.SBSC_GUID_KEY)AS TEST_COL1
FROM AM_PROGRAM_TUNING_EVENT_TMP1 B1;
答案 0 :(得分:4)
如果你在OVER()子句中有一个订单,对于通常对排序不敏感的聚合(min,max,stdev等等),它就会成为一个运行小计。请参阅Justin Cave对以下问题的回答,以获得更彻底的治疗。
Oracle MIN as analytic function - odd behavior with 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的BOTH行而言是11:50。最后两行在11:50之后永远不会有ET,所以这就是我们为所有剩余行显示的内容。我们在OVER子句中使用了ORDER BY,这就是我们告诉Oracle要做的事情。
答案 1 :(得分:2)
Oracle documentation for analytic functions说:
*If you omit the windowing_clause entirely, then the default is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.*
如果您了解 RANGE 的工作原理,那么您应该清楚为什么会看到这样的结果。