分析函数MAX问题

时间:2016-10-08 08:09:56

标签: sql oracle max analytic-functions

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

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,这就是为什么总是建议添加窗口定义而不是依赖默认值的原因。