2015-12-15 63 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

完美,謝謝,讓我檢查。 –