【问题标题】:Max difference between update timestamps更新时间戳之间的最大差异
【发布时间】:2019-05-06 02:20:31
【问题描述】:

我有一张桌子:

id | updated_at
1  | 2018-10-22T21:00:00Z
2  | 2018-10-22T21:02:00Z

我想在最接近的更新时间戳之间找到给定日期的最大增量。例如,如果有 5 行:

id | updated_at
1  | 2018-10-22T21:00:00Z
2  | 2018-10-22T21:02:00Z
3  | 2018-10-22T21:05:00Z
4  | 2018-10-22T21:06:00Z
5  | 2018-10-22T21:16:00Z

最大的增量在 4 到 5 之间(10 分钟)。请注意,在比较时,我只想找到下一个最接近的 updated_at 时间戳,然后给我这个的max。我觉得我搞砸了子查询来做到这一点。

 with nearest_time(time_diff)
 as
 (
   select datediff('minute', updated_at as u1, (select updated_at from table where updated_at > u1 limit 1) as u2)
   group by updated_at::date
 )

 select max(select time_diff from nearest_time);

【问题讨论】:

    标签: sql postgresql amazon-redshift window-functions


    【解决方案1】:

    使用lag 从上一行获取updated_at,然后获取每天的最大差异。

    select dt_updated_at,max(time_diff)
    from (select updated_at::date as dt_updated_at
          ,updated_at - lag(updated_at) over(partition by updated_at::date order by updated_at) as time_diff
          from tbl
         ) t 
    group by dt_updated_at
    

    使用DISTINCT ON 的另一个选项(仅适用于 Postgres..因为问题最初被标记为 Postgres,所以保留此答案)

    select distinct on
     (updated_at::date) 
     updated_at::date as dt_updated_at 
    ,updated_at-lag(updated_at) over(partition by updated_at::date order by updated_at) as diff
    from dates
    order by updated_at::date,diff desc
    nulls last
    

    【讨论】:

      【解决方案2】:

      demo:db<>fiddle

      SELECT 
          lead(updated) OVER (ORDER BY updated) - updated as diff 
      FROM dates 
      ORDER BY diff DESC NULLS LAST
      LIMIT 1;
      

      使用window function LEAD 可以获取下一行的值:在这种情况下,您可以获得下一个时间戳。

      你可以做一个减法,对结果进行降序排序并取第一个值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-16
        • 2014-05-04
        • 1970-01-01
        • 2017-05-09
        相关资源
        最近更新 更多