2015-12-15 70 views
3

我有一个表名payment_schedule与以下内容获取与MAX DATE和组行BY

payment_schedule

我想MAX(due_date) GROUPED BY loan_application_id

参考获取记录在上面的图像记录,我期待结果是继

enter image description here

我尝试使用以下SQL查询

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

这将返回以下结果。

enter image description here

正如你看到它不针对给定的到期日返回相应id

此外,我有另一列payment_type_id,我需要排除payment_type_id值为3的行。

我尝试了几种解决方案在这里,似乎没有任何工作,如何去做呢?

谢谢。

+0

嗨,这个怎么查询? SELECT ID, MAX(DUE_DATE)作为DUE_DATE, loan_application_id FROM payment_schedule GROUP BY loan_application_id,ID – M3ghana

+0

的可能的复制[选择每个GROUP BY组第一行?](http://stackoverflow.com/questions/3800551/select-first-in-each-group-by-group) – billynoah

回答

2

这就是所谓的组间最大值并在这里标记为。最传统的做法是找到你想要的值,并做了一个连接以获取每组对应的行这样的:

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 

另外值得一提的是,该查询将运行bazillion倍的速度,如果你有一个索引在你的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

+0

谢谢,检查出来。 –

+0

我修改了我的答案,提到这一点,但要确保您在相关列上有索引。它将使大型桌面上的速度提高很多。 – billynoah

+0

感谢@billynoah,它完美地工作。 –

0

在大多数数据库中,这是最简单的使用窗口函数。在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; 
+0

这给我不正确的结果,它返回3条记录,我更新了我的问题以反映结果。 –

+0

@IbrahimAzharArmar。 。它缺少一个连接条件。 –

2

如果每个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 
+0

谢谢,这工作,我忘了添加一个更多的条件,即我有另一个名为payment_type_id的列,我需要排除行payment_type_id的值为3时 –

+0

确定更新。如果您的payment_type_id得到空值:使用这个:where ifnull(payment_type_id,0)<> 3 – SIDU

+0

完美,谢谢,让我检查。 –