SQL查询:查找不超过3笔交易累计到账≥1000的收款人
问题需求
现有transaction交易表,包含sender(付款方)、receiver(收款方)、date(交易日期)、amount(交易金额)四个字段,需要查询所有符合以下条件的收款方姓名:收款方的交易记录中,存在不超过3笔的交易累计金额≥1000,最终结果按收款方姓名升序排序。
解决思路
要判断收款方是否能通过不超过3笔交易凑够1000元,最优验证方式为取该收款方金额最高的前3笔交易求和:如果最高的3笔累计金额都达不到1000,那么其他任意组合的3笔及以内交易也不可能达到要求。
实现代码
通用窗口函数写法(支持MySQL8.0+/PostgreSQL/Oracle等所有支持窗口函数的数据库)
WITH ranked_trans AS ( SELECT receiver, amount, -- 按收款方分组,组内交易按金额从高到低排序打行号 ROW_NUMBER() OVER (PARTITION BY receiver ORDER BY amount DESC) AS rn FROM transaction ) SELECT receiver FROM ranked_trans WHERE rn <= 3 -- 仅取每个收款方金额最高的前3笔 GROUP BY receiver HAVING SUM(amount) >= 1000 -- 前3笔累计达标即符合条件 ORDER BY receiver ASC;
低版本MySQL兼容写法(不支持窗口函数场景)
SELECT t1.receiver FROM transaction t1 WHERE ( -- 统计当前交易在对应收款方的所有交易中,金额排名在前3以内 SELECT COUNT(*) FROM transaction t2 WHERE t2.receiver = t1.receiver AND t2.amount >= t1.amount ) <= 3 GROUP BY t1.receiver HAVING SUM(t1.amount) >= 1000 ORDER BY t1.receiver ASC;
结果验证
针对示例数据,计算结果为B、D,和预期输出一致:
- B的前2笔最高交易金额为500+500=1000,满足条件
- D的第1笔最高交易金额为4000,满足条件
- C的前2笔最高交易金额为400+60=460,不满足
- A的前3笔最高交易金额均为50,累计150,不满足
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

