使用SQL有条件地对连续行求和

时间:2018-09-03 16:15:12

标签: sql amazon-athena presto

我的数据以5分钟的包发送给我。我正在逐秒读取设备的状态,并且已经构建了一个脚本来使用熊猫聚合具有相同状态的连续行。我的数据看起来像这样。

timestamp   status     length
00:00:00    1          38
00:00:38    0          72
00:01:50    1          27
...

我希望查询一整天价值5分钟的包裹,而不会发现5分钟包装的边缘。当前,当我在AWS Athena中跨多个数据包查询时,我发现相同状态的连续行未聚合。

例如

timestamp status length
00:04:02 1 24
00:04:26 0 15
00:04:41 1 19
00:05:00 1 11
00:05:11 0 8
00:05:19 1 22
...

我想聚合两行,以便使用标准SQL将5分钟软件包边缘的状态聚合在一起,以使上面的示例如下所示。状态位相等的连续行将合计为一,并累加这些连续条目的长度。

timestamp status length
00:04:02 1 24
00:04:26 0 15
00:04:41 1 30
00:05:11 0 8
00:05:19 1 22
...

SQL内是否具有按照上述结构返回此查询的功能?

1 个答案:

答案 0 :(得分:0)

这是一个“空白和孤岛”的问题。 Amazon Athena支持row_number(),因此您可以使用行号差法解决它:

select status, min(timestamp) as timestamp, sum(length) as length
from (select t.*,
             row_number() over (order by timestamp) as seqnum,
             row_number() over (partition by status order by timestamp) as seqnum_s
      from t
     ) t
group by status, (seqnum - seqnum_s);