如何执行具有时间范围的 SUM 窗口函数,但在 SQL 中按行处理重复的时间戳

问题描述 投票:0回答:1

我有一个场景,我需要使用 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

问题:

  • 当存在重复时间戳时,RANGE 函数会将具有相同时间戳的所有条目分组到同一窗口中,从而导致意外结果。
  • 我需要在同一时间戳内单独处理行(按行)。

限制:

  • 我无法在时间戳列中添加任何轻微的噪音,因为它会改变我的时间窗口。是要精确计算的。

有没有办法调整 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 是在每个时间戳内逐行计算的,而不是对具有相同时间戳的行进行分组。

sql range window-functions rolling-computation partition-by
1个回答
0
投票

根据您的解释,您似乎不需要:

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
© www.soinside.com 2019 - 2024. All rights reserved.