从Oracle中的每个组中选择第N个值

时间:2018-03-09 07:46:20

标签: oracle greatest-n-per-group

我有两张表格如下

表A

CallbackQueryHandler

表B

Key    Field1  Created_date  
1234    a      Jan-18  
1234    b      Feb-18  
1234    c      Mar-18  
4567    d      Mar-18  
6789    e      Apr-18  

我想在字段Key上将表A与B连接,并选择Key Posted_date 1234 Mar-18 4567 Apr-18 其中max(A.created_date)的记录。表B有大约3亿条记录。你能帮帮我吗?

结果

A.created_date < B.posted_date

1 个答案:

答案 0 :(得分:0)

解决这个问题的各种不同方法。这是一个解决方案,将其分解为两个明确的步骤,以便您了解原则。

子查询使用分析排名为表created_date中与表key中的条件匹配的每个A记录的B评分。外部过滤器为每个最大A选择表created_date中的记录。

select a.key
       , a.field1
       , a.created_date
from (
  select a.*
         , rank() over (partition by a.key
                        order by a.created_date desc) as rnk
  from b
       join a on a.key = b.key
  where a.created_date < b.posted_date
  ) a
where a.rnk = 1
/

假设表B有3亿条记录,那么表格A就有更多。您必须尝试获得一个足以满足您需求的版本。例如,对于我们希望获得分区选项许可的大表;这可能会影响您如何处理连接和过滤。