【问题标题】:Conditionally sum consecutive rows with SQL使用 SQL 有条件地对连续行求和
【发布时间】:2018-09-03 16:15:12
【问题描述】:

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

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 中是否有能力按照上述结构返回此查询?

【问题讨论】:

  • “未聚合”的数据示例似乎与“聚合”的数据示例相同。请提供正确的“汇总”期望结果示例。同时发布您当前用于进行聚合的 sql。
  • 一整天值得吗?但是该示例数据中没有日期部分或字段?被视为edge 的时间限制是多少?
  • 请澄清数据点 00:04:02 1 24 是 4:02 的第一秒还是 24 秒持续时间的最后一秒?是否有先前的数据点,例如 00:03:52 0 10 ??还是会是 00:03:52 1 10 ???

标签: sql amazon-athena presto


【解决方案1】:

这是一个“差距和孤岛”问题。 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2021-01-28
    • 2019-07-05
    • 2021-06-19
    • 2014-11-22
    • 1970-01-01
    • 2017-12-11
    相关资源
    最近更新 更多