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

使用MySQL计算不同日期交易积分余额及差值

MySQL计算每日积分总余额及日差值

需求说明

按交易日期汇总当日积分总余额,并计算当日总余额与前一日总余额的差值。

样本数据

假设数据表名为transaction_points,字段包括:

  • id:交易编号(INT)
  • transaction_date:交易日期(VARCHAR,格式为DD-MM-YYYY)
  • points:交易积分(INT,正为增加,负为扣除)

样本数据如下:

idtransaction_datepoints
109-08-202310
209-08-2023-5
309-08-20238
409-08-2023-3
509-08-202315
609-08-2023-8
709-08-20235
809-08-2023-2
909-08-202312
1009-08-2023-6
1110-08-202311
1210-08-2023-4
1310-08-20237
1410-08-2023-3
1510-08-202313
1610-08-2023-7
1710-08-20236
1810-08-2023-2
1910-08-202310
2010-08-2023-5
2111-08-20239
2211-08-2023-4
2311-08-20238
2411-08-2023-3
2511-08-202314
2611-08-2023-7

解决方案SQL

SELECT
    transaction_date,
    daily_total AS 总积分,
    daily_total - LAG(daily_total) OVER (ORDER BY STR_TO_DATE(transaction_date, '%d-%m-%Y')) AS 差值
FROM (
    -- 先按日期汇总每日总积分
    SELECT
        transaction_date,
        SUM(points) AS daily_total
    FROM transaction_points
    GROUP BY transaction_date
) AS daily_summary
ORDER BY STR_TO_DATE(transaction_date, '%d-%m-%Y');

代码解释

  1. 内层子查询daily_summary:通过GROUP BY transaction_date分组,用SUM(points)计算当日积分总余额,得到每日的总积分数据。
  2. 外层查询:
    • 使用LAG(daily_total) OVER (ORDER BY STR_TO_DATE(transaction_date, '%d-%m-%Y'))获取前一日的总积分值,ORDER BY子句确保日期按时间顺序排序(原始日期为字符串格式,需用STR_TO_DATE转换为日期类型保证排序逻辑正确)。
    • 用当日总积分减去前一日总积分得到差值;第一日无前置数据,差值为NULL。

执行结果

transaction_date总积分差值
09-08-202326NULL
10-08-2023260
11-08-202317-9

内容的提问来源于stack exchange,提问作者geroge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:55:00