使用 MAX DATE 和 GROUP BY 获取行

Fetch rows with MAX DATE and GROUP BY

我有一个 table 名称 payment_schedule 包含以下内容

我想使用 MAX(due_date) GROUPED BY loan_application_id

获取记录

参考上图中的记录,我希望结果如下

我尝试使用以下 SQL 查询

SELECT
    id,
    MAX(due_date) as due_date,
    loan_application_id
FROM
    payment_schedule
GROUP BY
    loan_application_id

return我得到了以下结果。

如您所见,它没有 return 给定截止日期的相应 id

此外,我还有一个名为 payment_type_id 的列,当 payment_type_id 的值为 3.

时,我需要排除行

我尝试了这里提供的几种解决方案,似乎没有任何效果,怎么办?

谢谢。

在大多数数据库中,使用 window 函数最简单。在 MySQL 中,您可以使用 joingroup by:

select ps.*
from payment_schedule ps join
     (select load_application_id, max(due_date) as maxdd
      from payment_schedule
      group by load_application_id
     ) l
     on ps.load_application_id = l.load_application_id and ps.due_date = l.maxdd;

如果每个 loan_application_id 的截止日期不同,您可以删除下面的不同关键字:

select distinct a.*
from payment_schedule a, (
    select loan_application_id, max(due_date) max_date
    from payment_schedule
    where payment_type_id <> 3
    group by 1
) as b
where a.loan_application_id = b.loan_application_id
and a.due_date = b.max_date

这称为 分组最大值 并在此处标记为 。最传统的方法是找到你想要的值并进行连接以获得每个组的相应行,如下所示:

SELECT
    ps.id,
    ps.due_date,
    ps.loan_application_id
FROM
(
    SELECT
        MAX(due_date) as due_date,
        loan_application_id
    FROM payment_schedule
    WHERE payment_type_id != '3'
    GROUP BY loan_application_id
) ps2
    LEFT JOIN payment_schedule ps USING (loan_application_id)
WHERE ps.due_date = ps2.due_date
    AND ps.payment_type_id != '3'
GROUP BY ps.loan_application_id

还值得一提的是,如果您在 loan_application_iddue_date 列上有索引,此查询将 运行 快无数倍。

我在这里看到的关于 SO 的最佳讨论是:Select first row in each GROUP BY group?

也在此处的官方文档中解决:http://dev.mysql.com/doc/refman/5.7/en/example-maximum-column-group-row.html