【问题标题】:MAX with Inner join VS rank() overMAX with Inner join VS rank() over
【发布时间】:2017-03-29 15:54:15
【问题描述】:

我正在尝试获取给定帐户的最大余额

ACCT_BALANCE table:
ACCOUNT_JOIN,BALANCE_UPDATE_DATE,ACCT_VALUE
1   11:49 AM 3/21/2017  1000
1   10:49 AM 5/29/2017  2121
2   11:49 AM 3/29/2017  3332    
2   13:21 AM 3/33/2017  110
3   11:50 AM 4/4/2017   888 
4   10:49 AM 3/29/2017  66  
4   11:50 AM 3/3/2017   57000
4   10:49 AM 2/29/2017  2265
4   13:21 AM 3/2/2017   555 
4   11:50 AM 8/9/2017   555

例如,从 2017 年 5 月 29 日起,帐户加入 1 的最大余额为 2121

性能方面什么会更好?使用 MAX 和 Inner join 或 rank() over?

CREATE OR REPLACE VIEW MAX_VAL_VIEW
AS
SELECT ACCT_VALUE,ACCOUNT_JOIN
  FROM ( 
        SELECT ACCT_VALUE,ACCOUNT_JOIN,
           rank() over (partition by ACCOUNT_JOIN order by BALANCE_UPDATE_DATE desc) rnk
        FROM ACCT_BALANCE  
      )
 WHERE rnk = 1
/


CREATE OR REPLACE VIEW MAX_VAL_VIEW
AS
              SELECT A.ACCT_VALUE ,A.ACCOUNT_JOIN 
              FROM ACCT_BALANCE A
                WHERE A.BALANCE_UPDATE_DATE = (
                    SELECT max(B.BALANCE_UPDATE_DATE)
                    FROM ACCT_BALANCE B
                    WHERE B.ACCOUNT_JOIN = A.ACCOUNT_JOIN
        )
/

【问题讨论】:

    标签: oracle11g max oracle-analytics


    【解决方案1】:

    你也可以使用the last function:

    select max(acct_value) keep (dense_rank last order by balance_update_date) as acct_value,
      account_join
    from acct_balance
    group by account_join;
    
    ACCT_VALUE ACCOUNT_JOIN
    ---------- ------------
          2121            1
           110            2
           888            3
           555            4
    

    (使用修改后的日期/时间使它们都有效)。

    无论是那种方法还是rank() 方法都应该胜过max(B.BALANCE_UPDATE_DATE) 方法,因为它们只上桌一次。您可以查看所有三个查询的执行计划,以了解优化器如何处理它们 - 它们使用哪些索引(如果有)、多少次全表扫描等。

    【讨论】:

      猜你喜欢
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 2012-01-23
      • 2016-01-15
      相关资源
      最近更新 更多