我需要檢索所有應該重試的事務,具體取決于事務收到的訊息,例如,如果我們收到“超時”之類的錯誤訊息,則該事務需要進行第二次嘗試。所有交易都存盤在一個表中,這意味著如果支付 ID 重復,則意味著交易進行了重試,但是,在某些情況下不會發生這種情況。
我寫了一個查詢,它提取帶有錯誤訊息的交易,并按付款 ID 對它們進行分組,該查詢有效,但它也帶來了進行第二次嘗試的交易。
我究竟做錯了什么?
| payment_id | Bank | time_requested | issuer | message |attempt|
| 10369 | Citi | 2021-08-03 | Capital One | success | 1 |
| 10383 | HSBC | 2021-07-07 | Discover | success | 1 |
| 84530 | HSBC | 2021-07-07 | Visa | timeout | 1 |
| 84530 | HSBC | 2021-07-07 | Visa | success | 2 |
| 53030 | Citi | 2021-07-07 | Diners | success | 1 |
| 23930 | Citi | 2021-07-07 | Diners | timeout | 1 |
select payment_id, count(payment_id) as times
from paymentstbl
where message in ('timeout', 'disconnected','unknown', 'Unavaialble')
group by payment_id
having times =1
Results:
| payment_id | times |
| 84530 | 1 |-- Wrong. Id 84530 is twice in the table
| 23930 | 1 |-- Correct.
uj5u.com熱心網友回復:
看來您實際上并不關心計數,而實際要求是識別未成功的付款。如果這是真的,您可以通過標識每個payment_id.
SELECT DISTINCT pt2.*
FROM paymentstbl pt1
INNER JOIN paymentstbl pt2 ON pt2.payment_id = pt1.payment_id AND
pt2.attempt = (SELECT MAX(attempt)
FROM paymentstbl
WHERE payment_id = pt1.payment_id)
獲得最后一行后,您可以過濾它們以僅包含具有已知錯誤訊息之一的那些。
WHERE pt2.message IN ('timeout', 'disconnected', 'unknown', 'Unavaialble')
或者,您可以排除那些成功的。
WHERE pt2.message != 'success'
uj5u.com熱心網友回復:
如果您正在尋找有錯誤訊息但沒有任何成功付款的交易。如果是這樣,您可以嘗試以下查詢。
SELECT * from paymentstbl WHERE PAYMENTID NOT IN
(
SELECT payment_id FROM paymentstbl WHERE message IN ('timeout', 'disconnected', 'unknown', 'Unavaialble')
INTERSECT
SELECT payment_id FROM paymentstbl WHERE message= 'success'
)
and MESSAGE IN ('timeout', 'disconnected', 'unknown', 'Unavaialble')
Intersect將把那些成功的和超時/錯誤的支付 ID 放在一起。
現在過濾它們以僅包括那些具有超時/錯誤付款的內容。
uj5u.com熱心網友回復:
我認為,通過給予或何時執行 where 子句可以解決您的問題。
select payment_id, count(payment_id) as times
from paymentstbl
where message in ('timeout', 'disconnected','unknown', 'Unavaialble') or attempt > 1
group by payment_id
having times =1
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/345918.html
