WITH t AS (
SELECT 9 a
,sysdate d
,1 c
,1 e
FROM dual
UNION
SELECT 1 a
,sysdate - 5 d
,2 c
,1 e
FROM dual
UNION
SELECT 2 a
,sysdate - 2 d
,6 c
,1 e
FROM dual
UNION
SELECT 5 a
,sysdate - 4 d
,2 c
,1 e
FROM dual
UNION
SELECT 3 a
,sysdate - 1 d
,1 c
,1 e
FROM dual )
SELECT MAX(CASE
WHEN c = 2
THEN d
ELSE NULL
END) OVER (
PARTITION BY e ORDER BY d DESC ) DT1
,MAX(CASE
WHEN c = 2
THEN d
ELSE NULL
END) OVER (PARTITION BY e) DT2
,t.*
FROM t
问题: 在上面的查询中,我无法理解为什么在DT1中获得Null而不在DT2中。 Order By Clause在分析函数MAX中有什么影响?请帮我理解这个
结果:
DT || DT1 || A || D || C || E
NULL || 10/4/2016 0:03 || 9 || 10/8/2016 0:03 || 1 || 1
NULL || 10/4/2016 0:03 || 3 || 10/7/2016 0:03 || 1 || 1
NULL || 10/4/2016 0:03 || 2 || 10/6/2016 0:03 || 6 || 1
10/4/2016 0:03 || 10/4/2016 0:03 || 5 || 10/4/2016 0:03 || 2 || 1
10/4/2016 0:03 || 10/4/2016 0:03 || 1 || 10/3/2016 0:03 || 2 || 1
答案 0 :(得分:0)
在分析函数中指定ctrl + /
时,它默认为ORDER BY
的窗口定义(基于标准SQL)。
这是您使用隐式默认窗口的查询:
RANGE UNBOUNDED PRECEDING
顺便说一句,另外SELECT Max(CASE
WHEN c = 2
THEN d
ELSE NULL
END) Over (
PARTITION BY e ORDER BY d DESC Range Unbounded Preceding
) DT1
,Max(CASE
WHEN c = 2
THEN d
ELSE NULL
END) Over (PARTITION BY e range between unbounded preceding and unbounded following) DT2
,t.*
FROM t
的效率低于RANGE
,这就是为什么总是建议添加窗口定义而不是依赖默认值的原因。