更新时间戳之间的最大差异

Max difference between update timestamps

我有一个 table:

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);

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 可以获取下一行的值:在这种情况下,您可以获得下一个时间戳。

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

使用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