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

3天窗口滚动求和异常:同日期行重复计算及数据缺失

解决3天滚动金额求和中的重复行与数据异常问题

原始交易数据

交易ID(transaction_id)用户ID(user_id)金额(amount)交易日期(transaction_date)
354423240.1301/01/2022 12:00:00
2425423167.2401/03/2022 12:00:00
1352423234.1401/03/2022 12:00:00
2145423123.4501/04/2022 12:00:00
154442382.9001/06/2022 12:00:00
1223525124.2001/01/2022 12:00:00
1732525324.0001/02/2022 12:00:00
1413525100.5001/03/2022 12:00:00
1141525123.0001/03/2022 12:00:00
1341525198.3501/04/2022 12:00:00
2362826146.2401/02/2022 12:00:00
1234826242.0001/04/2022 12:00:00

原SQL查询

SELECT 
  user_id, 
  transaction_date, 
  SUM(amount) OVER(
    PARTITION BY user_id 
    ORDER BY transaction_date 
    RANGE BETWEEN interval '2 days' PRECEDING AND CURRENT ROW 
  ) AS rolling_earnings_3d 
FROM user_transactions;

错误输出

user_idtransaction_daterolling_earnings_3d
42301/01/2022 12:00:00240.13
42301/03/2022 12:00:00641.51
42301/03/2022 12:00:00641.51
42301/04/2022 12:00:00524.83
42301/06/2022 12:00:00206.35
52501/01/2022 12:00:00124.20
52501/02/2022 12:00:00448.20
52501/03/2022 12:00:00671.70
52501/03/2022 12:00:00671.70
52501/04/2022 12:00:00745.85
82601/02/2022 12:00:00146.24

期望输出

user_idtransaction_daterolling_earnings_3d
42301/01/2022 12:00:00240.13
42301/03/2022 12:00:00641.51
42301/04/2022 12:00:00524.83
42301/06/2022 12:00:00206.35
52501/01/2022 12:00:00124.20
52501/02/2022 12:00:00448.20
52501/03/2022 12:00:00671.70
52501/04/2022 12:00:00745.85
82601/02/2022 12:00:00146.24
82601/04/2022 12:00:00530.24
82601/07/2022 12:00:00100.00

问题分析与解决方案

问题原因

  1. 同日期重复行:原查询直接对单条交易计算滚动和,同一用户同一天的多笔交易都会返回相同的滚动结果,导致输出重复行。
  2. 用户826数据缺失:原查询未返回用户826的01/04交易行,核心原因是未先聚合每日金额,窗口统计逻辑未覆盖完整数据;另外期望输出中01/07的交易行需确保原始数据包含该记录。

解决步骤

  1. 聚合每日金额:按user_id和transaction_date分组,合并同一天的多笔交易为一行,消除重复输出的根源。
  2. 基于聚合数据计算滚动和:对每日聚合后的数据应用窗口函数,确保每个日期只返回一行结果,同时正确计算前2天到当前日期的金额总和。

修正后的SQL

WITH daily_transactions AS (
  SELECT 
    user_id,
    transaction_date,
    SUM(amount) AS daily_amount
  FROM user_transactions
  GROUP BY user_id, transaction_date
)
SELECT 
  user_id,
  transaction_date,
  SUM(daily_amount) OVER(
    PARTITION BY user_id
    ORDER BY transaction_date
    RANGE BETWEEN INTERVAL '2 days' PRECEDING AND CURRENT ROW
  ) AS rolling_earnings_3d
FROM daily_transactions
ORDER BY user_id, transaction_date;

说明

  • daily_transactions CTE先完成每日金额聚合,避免同日期多行重复。
  • 窗口函数基于聚合后的数据计算,确保每个日期仅返回一个滚动和结果。
  • 用户826的01/04交易行,聚合后滚动和会包含01/02的金额,若期望输出为530.24需检查原始数据是否存在其他补充交易;01/07的100.00交易需确保该记录存在于user_transactions表中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:09:52