【问题标题】:Oracle: get the last record which has same datesOracle:获取具有相同日期的最后一条记录
【发布时间】:2018-12-01 15:22:36
【问题描述】:

我正在尝试构建一个查询以获取可用于 MySQL、Oracle 10 和 12 的最新记录。

场景: 我有 4 个表 - 客户、地址、贷款、申请 我想加入这 4 个表以获取应用程序的客户名称和地址。

客户、贷款和申请是一对一的关系 而客户和地址是一对多的关系。

select count(c.name)
from application
left join loan on (loan.id = application.id)
inner join customer on (loan.cust_num = customer.id); 

这给出了 100 行;

select count(c.name)
from application
left join loan on (loan.id = application.id)
inner join customer on (loan.cust_num = customer.id)
inner join address a1 on (loan.cust_num = address.cust_num)
inner join (
select max(date) as max_date, cust_num
from address
where address_type = 'studio'
group by cust_num 
) a2
on a1.cust_num = a2.cust_num
and a1.date = a2.max_date;

这给出了 200 条记录,因为在某个日期的地址中有超过 1 条记录,其 address_type 是客户的“工作室”。

如何获取最新记录。

最后,我想要应用程序的地址表中的地址列和客户表中的名称。

谢谢。

【问题讨论】:

    标签: mysql sql oracle


    【解决方案1】:

    对于同时适用于 Oracle 和 MySQL 的代码,我建议使用相关子查询:

    select count(c.name)
    from application a join
         loan l
         on o.id = a.id join
         customer c
         on l.cust_num = c.id left join
         address ad
         on ad.cust_num = l.cust_num and
            ad.address_type = 'studio' and
            ad.date = (select max(ad2.date)
                       from address ad2
                       where ad2.cust_num  = ad.cust_num and
                             ad2.address_type = ad.address_type
                      );
    

    如果您使用 MySQL 8+ 或不需要 MySQL,那么您应该按照 Tim 的建议使用 row_number()

    请注意,我删除了 left joinjoincustomer 使用来自 loan 的字段,这会将外连接变为内连接。你不妨把实际实现的逻辑表达出来。

    【讨论】:

    • 我这样使用: WITH cte AS ( SELECT c.name, ROW_NUMBER() OVER (PARTITION BY a1.cust_num ORDER BY a1.date DESC) rn FROM application a LEFT JOIN loan l ON l。 id = a.id INNER JOIN customer c ON l.cust_num = c.id INNER JOIN address a1 ON (l.cust_num = a1.cust_num and a1.address_type = 'studio') ) SELECT COUNT(name) FROM cte WHERE rn = 1;
    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2021-10-18
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多