我有一个场景,我需要使用 SQL 中的 SUM 窗口函数来计算运行总计。出现此问题的原因是某些行具有重复的时间戳,并且窗口函数中的 RANGE 子句将具有相同时间戳的所有行分组在一起,从而导致计算错误。
这是我尝试使用的 SQL 示例:
SUM(volume) OVER (
PARTITION BY ID
ORDER BY td.timestamp
RANGE BETWEEN INTERVAL '60' SECOND PRECEDING AND CURRENT ROW
) AS total_volume
问题:
限制:
有没有办法调整 SQL 以在同一时间戳范围内正确处理行,同时遵守时间窗口逻辑?
输入
时间戳 | 音量 |
---|---|
2024-11-16 08:00:00 | 10 |
2024-11-16 08:00:00 | 20 |
2024-11-16 08:01:00 | 30 |
2024-11-16 08:02:00 | 40 |
2024-11-16 08:02:00 | 50 |
当前结果(使用 RANGE 并按时间戳分组)
时间戳 | 卷卷 |
---|---|
2024-11-16 08:00:00 | 30 |
2024-11-16 08:00:00 | 30 |
2024-11-16 08:01:00 | 30 |
2024-11-16 08:02:00 | 90 |
2024-11-16 08:02:00 | 90 |
预期输出
时间戳 | 卷卷 |
---|---|
2024-11-16 08:00:00 | 10 |
2024-11-16 08:00:00 | 30 |
2024-11-16 08:01:00 | 30 |
2024-11-16 08:02:00 | 40 |
2024-11-16 08:02:00 | 90 |
这里,RollVolume 是在每个时间戳内逐行计算的,而不是对具有相同时间戳的行进行分组。
根据您的解释,您似乎不需要:
RANGE BETWEEN INTERVAL '60' SECOND PRECEDING AND CURRENT ROW
或者我在这里遗漏了一个要求?
如果您在查询中消除了这一点,它将计算它看到的每行的运行总计,尽管有重复项。
SELECT timestamp, SUM(volume) OVER (
PARTITION BY ID
ORDER BY timestamp
) AS total_volume
FROM YourTable;
结果:
timestamp total_volume
2024-11-16 08:00:00.00 10
2024-11-16 08:00:00.00 20
2024-11-16 08:01:00.00 30
2024-11-16 08:02:00.00 40
2024-11-16 08:02:00.00 50