各位下午好...
我有以下查询,返回以下结果:
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 |
有人可以帮助我吗?
无需更改当前查询即可执行的一种快速解决方案是将每个
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
。