按payment_id分组查询未重试报错交易结果错误的问题排查
问题原因分析
- SQL逻辑顺序错误:WHERE子句会先把所有message不属于指定错误类型的记录全部过滤掉,payment_id为84530的第二条success记录直接被排除在统计范围外,你统计的
count(payment_id)实际是该ID的错误记录数,不是该ID的总交易次数,才会出现错误的统计结果。 - 存在拼写错误:WHERE子句中的
Unavaialble拼写错误,正确应为Unavailable,会导致这类错误无法被正常匹配。
正确SQL写法
符合需求的逻辑是:筛选满足「存在至少一条需重试的错误记录、且不存在任何成功交易记录」的payment_id,正确SQL如下:
SELECT payment_id, COUNT(*) AS total_trade_times FROM paymentstbl GROUP BY payment_id HAVING -- 存在至少1条需重试的错误记录 SUM(CASE WHEN message IN ('timeout', 'disconnected','unknown', 'Unavailable') THEN 1 ELSE 0 END) >= 1 -- 没有任何成功记录,说明未完成重试 AND SUM(CASE WHEN message = 'success' THEN 1 ELSE 0 END) = 0
执行后只会返回payment_id为23930的结果,符合预期。
内容的提问来源于stack exchange,提问作者JordanS
相关产品推荐
相关产品推荐

