按日期最后注册进行分组

问题描述 投票:0回答:1

各位下午好...

我有以下查询,返回以下结果:

SELECT 
    r.rec_num as Column_A
    ,c.amount as Column_B
    ,c.status as Column_C
    ,c.currency_code_to as Column_D
    ,c.due_date as Column_E
    ,c.id_recurrency as Column_F
FROM purchase c
JOIN recurrency r ON c.id_recurrency = r.id
JOIN item_product ip ON c.item_estoque = ip.id
JOIN signature a ON a.id = ip.signature
WHERE a.id = :id
    AND r.plano_signature IS NOT NULL
    AND r.rec_num IN (1,2,3,4)
    AND r.rec_num NOT IN (
        SELECT rn.recurrence
        FROM negotiate n
        JOIN negotiate_recurrence rn ON rn.negotiate = n.id
        JOIN purchase purchase ON purchase.id = n.purchase
        WHERE n.subscription = a.id
            AND rn.recurrence = r.rec_num
            AND purchase.status IN (
                'VALID'
                ,'FILED'
                )
        )
    AND r.rec_num NOT IN (
        SELECT r2.rec_num
        FROM purchase c2
        JOIN recurrency r2 ON c2.id_recurrency = r2.id
        JOIN item_product ip2 ON c2.item_estoque = ip2.id
        WHERE ip2.signature = a.id
            AND c2.status IN ('VALID','FILED')
        )
    AND c.id NOT IN (
        SELECT n1.purchase
        FROM negotiate n1
        WHERE n1.subscription = a.id
        )
    AND c.status = 'DELAYED'
A 栏 B 栏 C 栏 D 栏 E 栏 F 栏
2 1000 延迟 巴西利亚 2023-10-04T19:48:17.000Z 11102501
2 250 延迟 巴西利亚 2023-10-04T19:54:16.000Z 11102502
2 250 延迟 巴西利亚 2023-10-09T23:30:20.000Z 11102503
2 250 延迟 巴西利亚 2023-10-14T18:14:20.000Z 12042504
3 250 延迟 巴西利亚 2023-11-04T12:51:33.000Z 13842790

我需要它按日期和重复次数返回最后的结果:

A 栏 B 栏 C 栏 D 栏 E 栏 F 栏
2 250 延迟 巴西利亚 2023-10-14T18:14:20.000Z 12042504
3 250 延迟 巴西利亚 2023-11-04T12:51:33.000Z 13842790

我尝试在 DUE_DATE 上设置 MAX 并按 rec_num 分组,但结果如下:

SELECT 
    r.rec_num as Column_A
    ,c.amount as Column_B
    ,c.status as Column_C
    ,c.currency_code_to as Column_D
    ,max(c.due_date) as Column_E
    ,c.id_recurrency as Column_F
FROM purchase c
JOIN recurrency r ON c.id_recurrency = r.id
JOIN item_product ip ON c.item_estoque = ip.id
JOIN signature a ON a.id = ip.signature
WHERE a.id = :id
    AND r.plano_signature IS NOT NULL
    AND r.rec_num IN (1,2,3,4)
    AND r.rec_num NOT IN (
        SELECT rn.recurrence
        FROM negotiate n
        JOIN negotiate_recurrence rn ON rn.negotiate = n.id
        JOIN purchase purchase ON purchase.id = n.purchase
        WHERE n.subscription = a.id
            AND rn.recurrence = r.rec_num
            AND purchase.status IN (
                'VALID'
                ,'FILED'
                )
        )
    AND r.rec_num NOT IN (
        SELECT r2.rec_num
        FROM purchase c2
        JOIN recurrency r2 ON c2.id_recurrency = r2.id
        JOIN item_product ip2 ON c2.item_estoque = ip2.id
        WHERE ip2.signature = a.id
            AND c2.status IN ('VALID','FILED')
        )
    AND c.id NOT IN (
        SELECT n1.purchase
        FROM negotiate n1
        WHERE n1.subscription = a.id
        )
GROUP BY r.rec_num
    
A 栏 B 栏 C 栏 D 栏 E 栏 F 栏
2 1000 延迟 巴西利亚 2023-10-14T18:14:20.000Z 11102501
3 250 延迟 巴西利亚 2023-11-04T12:51:33.000Z 13842790

有人可以帮助我吗?

mysql select filter group-by sql-order-by
1个回答
0
投票

无需更改当前查询即可执行的一种快速解决方案是将每个

rec_num
及其
MAX(c.due_date)
分别提取为派生表,并将
JOIN
与当前查询一起提取。例如:

SELECT 
    r.rec_num as Column_A
    ,c.amount as Column_B
    ,c.status as Column_C
    ,c.currency_code_to as Column_D
    ,c.due_date as Column_E
    ,c.id_recurrency as Column_F
FROM purchase c
JOIN recurrency r ON c.id_recurrency = r.id
JOIN item_product ip ON c.item_estoque = ip.id
JOIN signature a ON a.id = ip.signature
/*add this*/
JOIN (SELECT rec_num, MAX(due_date) AS dd FROM purchase
        JOIN recurrency ON id_recurrency = id GROUP BY rec_num) dt
  ON r.rec_num = dt.rec_num AND c.due_date = dt.dd
... /*the rest of the query*/

并从查询中删除

GROUP BY r.rec_num

© www.soinside.com 2019 - 2024. All rights reserved.