MAX with Inner join VS rank() over

Posted

技术标签:

【中文标题】MAX 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
        )
/

【问题讨论】:

【参考方案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) 方法,因为它们只上桌一次。您可以查看所有三个查询的执行计划,以了解优化器如何处理它们 - 它们使用哪些索引(如果有)、多少次全表扫描等。

【讨论】:

以上是关于MAX with Inner join VS rank() over的主要内容,如果未能解决你的问题,请参考以下文章

(', CROSS, FULL, INNER, JOIN, LEFT, NATURAL, ON, RIGHT 或 USING 预期,得到'WITH'

SQL Server - INNER JOIN WITH DISTINCT

INNER JOIN with WHERE lower(...) like ... 性能

LEFT OUTER JOIN with 'field IS NULL' in WHERE 用作 INNER JOIN

Mysql Count with Inner join of two tables, Average Join

Laravel Eloquent Join vs Inner Join?