【问题标题】:How to count difference in consecutive timestamps in SQL?如何计算 SQL 中连续时间戳的差异?
【发布时间】:2021-06-08 02:37:31
【问题描述】:

所以我有一些看起来像这样的数据:

   USER_ID      text_field                   TIMESTAMP 
1  0000001          dragon     2021-06-04 21:23:30.612      
2  0000001          dragon     2021-06-04 21:23:55.411
3  0000001          dragon     2021-06-04 21:27:35.418
4  0000002         pitbull     2021-06-04 19:17:53.211
5  0000002          dragon     2021-06-04 19:47:53.211
6  0000002          dragon     2021-06-04 19:57:53.211
7  0000003          dragon     2021-06-05 10:00:53.211
8  0000003          dragon     2021-06-05 10:02:53.211
9  0000003           earth     2021-06-05 10:04:53.211
10 0000003          dragon     2021-06-05 10:06:53.211
11 0000003          dragon     2021-06-05 10:08:53.211

我希望看到的是带有单词dragon的结果条目的第一个和最后一个时间戳之间的差异

所以在 ID 0000001 中,我们的所有条目都为 dragon,所以对于这种情况,我想要第 3 行减去第 1 行。这是所有以龙和 ID = 0000001 为特征的条目的最大值(时间戳)-最小值(时间戳)。

对于 ID 2,请注意并非所有都是龙,但我只希望 dragon 条目具有相同的差异。

ID 也可能有非结果性的 dragon 条目,例如 ID 0000003。这里我需要两个块中的结果性条目有所不同。这意味着对于 ID 0000003,我需要row 8 - row 7row 11 - row 10

最终输出:

USER_ID  time_diff
0000001       (2021-06-04 21:27:35.418  - 2021-06-04 21:23:30.612)
0000002       (2021-06-04 19:57:53.211  - 2021-06-04 19:47:53.211)
0000003       (2021-06-05 10:02:53.211  - 2021-06-05 10:00:53.211)
0000003       (2021-06-05 10:08:53.211  - 2021-06-05 10:06:53.211)

显然,这些只是 time_diff 的方程式,我真的很想在这个专栏中有所不同。

【问题讨论】:

  • 如果第 7 行不存在怎么办? time_diff 如何确定?

标签: sql timestamp snowflake-cloud-data-platform


【解决方案1】:

如果您只特别关心“龙”,则可以使用每行非龙的累积总和来识别每个组。然后聚合:

select userid, min(timestamp), max(timestamp)
from (select t.*,
             sum(case when text_field <> 'dragon' then 1 else 0 end) over (partition by user_id order by timestamp) as grp
      from t
     ) t
where text_field = 'dragon'
group by userid, grp;

您可以随意计算差异。

【讨论】:

    【解决方案2】:

    你可以这样做:

    select user_id , min(TIMESTAMP) , max(TIMESTAMP), datediff(second,max(TIMESTAMP),min(TIMESTAMP)) time_diff
    from (
      select *
       , rank() over (partition by user_id order by TIMESTAMP)
        -rank() over (partition by user_id,text_field order by TIMESTAMP) rn
      from users
    ) t
    where text_field = 'dragon'
    group by user_id , rn 
    order by user_id 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多