2017-03-29 54 views
0

我想針對指定帳戶MAX與內連接VS級()在

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 

例如獲取最大的平衡,帳戶餘額最多加入1是從2121 2017年5月29日

性能明智哪些會更好?使用MAX與內連接或等級()結束?

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 
     ) 
/

回答

2

您還可以使用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)的方法,因爲它們只能擊中一次。您可以查看所有三個查詢的執行計劃,以查看優化程序如何處理它們 - 它們使用哪些索引(如果有),多少個全表掃描等。