You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:39:28