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