使用 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 中,您可以使用 join
和 group 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
这称为 分组最大值 并在此处标记为 greatest-n-per-group。最传统的方法是找到你想要的值并进行连接以获得每个组的相应行,如下所示:
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_id
和 due_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
我有一个 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 中,您可以使用 join
和 group 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
这称为 分组最大值 并在此处标记为 greatest-n-per-group。最传统的方法是找到你想要的值并进行连接以获得每个组的相应行,如下所示:
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_id
和 due_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