更新时间戳之间的最大差异
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);
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
我有一个 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);
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