如何在有序表的一列中比较一行的值和上一行的值?

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

【讨论】:

以上是关于如何在有序表的一列中比较一行的值和上一行的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在表的每一行中查找哪一列包含特定值

当前行和上一行之间具有特定值的窗口函数

如何计算包含一组列中的值和 Pandas 数据框中另一列中的另一个值的行数?

如何使用变量“最后一行号”来设置另一列中的范围

如何仅在 QTableWidget 的一列中添加一行?

如何获得DataGridView中某一列中全部的值?