如何通过SQL获取banking表指定排序前2条记录的金额总和(输出60)
问题描述
我有一张名为banking的表,结构及数据如下:
+------------------------------+ | id | amount | created | +------------------------------+ | 1 | 10 | 2018-01-18 00:10:00 | | 2 | 20 | 2018-01-18 00:50:00 | | 3 | 30 | 2018-01-18 00:20:00 | | 4 | 40 | 2018-01-18 00:30:00 | +------------------------------+
我想要得到的结果是60——也就是时间最晚的两条记录的金额之和(20+40)。我试了下面的查询:
SELECT sum(amount) FROM banking WHERE created >= '2018-01-18 00:00:00' AND created < '2018-01-18 18:01:35' GROUP BY created ORDER BY created DESC LIMIT 2;
但得到的是两个单独的数值:
+---------+ | sum | +---------+ | 20 | | 40 | +---------+
请问怎么改查询才能得到单个结果60呢?
解决办法
咱们先说说原查询的问题:你用GROUP BY created把每个唯一的时间戳分成了单独的组,每个组的sum(amount)其实就是单条记录的金额(因为每个时间戳只有一条数据),然后LIMIT 2只是把前两个组的结果列出来了,但没把它们加起来。
这里有两种写法,你可以根据实际数据情况选:
场景1:每个时间戳只有一条记录(和你的示例数据一样)
直接先筛选出时间最晚的两条记录,再求和就行:
SELECT SUM(amount) AS total FROM ( -- 先取符合时间条件、最晚的两条记录的金额 SELECT amount FROM banking WHERE created >= '2018-01-18 00:00:00' AND created < '2018-01-18 18:01:35' ORDER BY created DESC LIMIT 2 ) AS top_two_records;
场景2:同一时间戳可能有多条记录
如果存在同一个时间点有多条交易记录的情况,你需要先计算每个时间点的总金额,再取最晚的两个时间点的金额总和:
SELECT SUM(group_sum) AS total FROM ( -- 先按时间分组计算每个时间点的总金额,再取最晚的两个分组 SELECT SUM(amount) AS group_sum FROM banking WHERE created >= '2018-01-18 00:00:00' AND created < '2018-01-18 18:01:35' GROUP BY created ORDER BY created DESC LIMIT 2 ) AS top_two_groups;
这两种写法在你的示例数据上都会返回60,而且是单个标量结果,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Tharunkumar
相关产品推荐
相关产品推荐

