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

MySQL如何查询各钱包当日首/末笔余额并计算期初、期末总余额

MySQL查询方案

方案1:MySQL 8.0及以上版本(支持窗口函数)

通过ROW_NUMBER()窗口函数标记每个钱包当日的首条、末条记录,过滤后求和即可:

SELECT
    SUM(CASE WHEN rn_asc = 1 THEN balance ELSE 0 END) AS 期初总余额,
    SUM(CASE WHEN rn_desc = 1 THEN balance ELSE 0 END) AS 期末总余额
FROM (
    SELECT
        wallet,
        balance,
        -- 按钱包分组,时间正序排名,rn_asc=1就是该钱包当日首条记录
        ROW_NUMBER() OVER (PARTITION BY wallet ORDER BY `timestamp` ASC) AS rn_asc,
        -- 按钱包分组,时间倒序排名,rn_desc=1就是该钱包当日末条记录
        ROW_NUMBER() OVER (PARTITION BY wallet ORDER BY `timestamp` DESC) AS rn_desc
    FROM 你的表名
    -- 筛选当日数据,此处示例为2021-04-19,可替换为CURDATE()统计当天
    WHERE DATE(`timestamp`) = '2021-04-19'
) t
WHERE rn_asc = 1 OR rn_desc = 1;

方案2:MySQL 5.x版本(无窗口函数支持)

通过关联子查询匹配每个钱包当日的最早、最晚时间对应的余额,再求和:

SELECT
    (SELECT SUM(balance)
     FROM 你的表名 t1
     WHERE DATE(t1.`timestamp`) = '2021-04-19'
     AND t1.`timestamp` = (SELECT MIN(t2.`timestamp`) FROM 你的表名 t2 WHERE t2.wallet = t1.wallet AND DATE(t2.`timestamp`) = '2021-04-19')) AS 期初总余额,
    (SELECT SUM(balance)
     FROM 你的表名 t1
     WHERE DATE(t1.`timestamp`) = '2021-04-19'
     AND t1.`timestamp` = (SELECT MAX(t2.`timestamp`) FROM 你的表名 t2 WHERE t2.wallet = t1.wallet AND DATE(t2.`timestamp`) = '2021-04-19')) AS 期末总余额;

结果验证

上述两种方案在示例数据上执行后,返回结果与预期完全一致:

  • 期初总余额:5500
  • 期末总余额:5590

注意:timestamp是MySQL关键字,查询时需要用反引号包裹避免语法错误。

内容的提问来源于stack exchange,提问作者Luis Alberto Murcia Solivella

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:48:02