如何在有序表的一列中比较一行的值和上一行的值?
Posted
技术标签:
【中文标题】如何在有序表的一列中比较一行的值和上一行的值?【英文标题】:How to compare the value of one row with the upper row in one column of an ordered table? 【发布时间】:2021-03-13 21:30:26 【问题描述】:我在 PostgreSQL 中有一个表格,其中包含来自手机的 GPS 点。它有一个整数列,用于存储纪元(从 1960 年开始的秒数)。我想根据时间(纪元列)排序表,然后在超过 2 分钟没有 GPS 记录的情况下将行程中断为子行程。
我用 GeoPandas 做到了。但是,它太慢了。我想在 PostgreSQL 里面做。如何将有序表的每一行与前一行进行比较(以查看时代是否相差 2 分钟或更多)? 其实我不知道如何将每一行与上一行进行比较。
【问题讨论】:
【参考方案1】:你可以使用lag()
:
select t.*
from (select t.*,
lag(timestamp_epoch) over (partition by trip order by timestamp_epoch) as last_timestamp_epoch
from t
) t
where last_timestamp_epoch < timestamp_epoch - 120
【讨论】:
【参考方案2】:我想根据时间(纪元列)排序表,然后,当超过 2 分钟没有 GPS 记录时,将行程中断为子行程。
与上一行(或下一行)比较后,利用窗口函数lag()
(或lead()
),根据间隔分组,得到子行程数:
SELECT *, count(*) FILTER (WHERE step) OVER (PARTITION BY trip ORDER BY timestamp_epoch) AS sub_trip
FROM (
SELECT *
, (timestamp_epoch - lag(timestamp_epoch) OVER (PARTITION BY trip ORDER BY timestamp_epoch)) > 120 AS step
FROM tbl
) sub;
进一步阅读:
Select longest continuous sequence【讨论】:
以上是关于如何在有序表的一列中比较一行的值和上一行的值?的主要内容,如果未能解决你的问题,请参考以下文章