MySQL中如何将总金额最高的单笔交易金额插入目标表?
解决MySQL中筛选单笔金额总求和最高值并插入的问题
你当前的SQL错误在于按DONOR_ID直接分组求和,得到的是该用户所有交易的总金额(1950),而不是按单笔交易金额分组后计算的各金额总求和。
修正步骤
- 修正目标表主键错误
原donationrequests表定义中PRIMARY KEY (USER)是错误的,表中不存在USER字段,应改为以DONOR_ID为主键:
ALTER TABLE donationrequests DROP PRIMARY KEY; ALTER TABLE donationrequests ADD PRIMARY KEY (DONOR_ID);
- 执行正确的插入逻辑
方法1(MySQL 8.0+ 支持窗口函数)
通过窗口函数RANK()对每个用户的各单笔金额总求和进行排名,筛选出排名第一的金额插入:
INSERT INTO donationrequests (DONOR_ID, ASK) SELECT DONOR_ID, TRANSACTION_AMT FROM ( SELECT DONOR_ID, TRANSACTION_AMT, SUM(TRANSACTION_AMT) AS total_per_amt, RANK() OVER (PARTITION BY DONOR_ID ORDER BY SUM(TRANSACTION_AMT) DESC) AS rnk FROM transactions GROUP BY DONOR_ID, TRANSACTION_AMT ) AS ranked WHERE rnk = 1;
- 内层子查询:按用户和单笔交易金额分组,计算该金额的总求和(即该金额×出现次数),同时为每个用户的各金额按总求和降序排名
- 外层查询:筛选出排名为1的记录,即总求和最高的单笔交易金额,插入目标表
方法2(兼容MySQL 8.0以下版本)
使用嵌套子查询筛选出每个用户的最大单笔金额总求和,再匹配对应的交易金额:
INSERT INTO donationrequests (DONOR_ID, ASK) SELECT t1.DONOR_ID, t1.TRANSACTION_AMT FROM transactions t1 GROUP BY t1.DONOR_ID, t1.TRANSACTION_AMT HAVING SUM(t1.TRANSACTION_AMT) = ( SELECT MAX(total_amt) FROM ( SELECT SUM(t2.TRANSACTION_AMT) AS total_amt FROM transactions t2 WHERE t2.DONOR_ID = t1.DONOR_ID GROUP BY t2.TRANSACTION_AMT ) AS sub );
内容的提问来源于stack exchange,提问作者Mark Hardy
相关产品推荐
相关产品推荐

