sql - 在具有非基于时间的开始和结束列的表中查找间隙

标签 sql database postgresql

我需要根据 double 开始和结束列找出连续数据点中的间隙。

为简单起见,我们称它们为 startPointendPoint,它们跟踪一条直线上的空间位置。 endPoint 和 startPoint 之间的差异将命名为距离。在这个“距离”上,捕获特定的力/效果信号值,并根据这些值将状态存储在表中。每行都有一个唯一的 id 标识符。

因此,表格如下所示:

| id | startPoint | endPoint | state    |
|----|------------|----------|----------|
| 1  | 0.0        | 5.8      | Active   |
| 2  | 5.8        | 7.1      | Inactive |
| 3  | 7.5        | 10.2     | Inactive |
| 4  | 10.2       | 11.3     | Inactive |
| 5  | 11.6       | 12.1     | Active   |

我一直在努力想出一个可以在 PostgresSQL 中运行并产生以下结果的查询:

| startGap   | endGap   |
|------------|----------|
| 7.1        | 7.5      |
| 11.3       | 11.6     |

我很清楚,我所要做的就是将之前的 endPoint 与接下来的 startPoint 进行比较,但到目前为止我运气不好。

如有任何帮助,我们将不胜感激。

最佳答案

使用窗口函数lead() :

with my_table(id, startpoint, endpoint, state) as (
values
    (1, 0.0, 5.8, 'Active'),
    (2, 5.8, 7.1, 'Inactive'),
    (3, 7.5, 10.2, 'Inactive'),
    (4, 10.2, 11.3, 'Inactive'),
    (5, 11.6, 12.1, 'Active')
)

select *
from (
    select endpoint as startgap, lead(startpoint) over (order by startpoint) as endgap
    from my_table
    ) s
where startgap <> endgap;

 startgap | endgap 
----------+--------
      7.1 |    7.5
     11.3 |   11.6
(2 rows)

关于sql - 在具有非基于时间的开始和结束列的表中查找间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45443177/

相关文章:

sql - 按证券计算 4 个季度移动平均线

sql - 如何在 SQL Server 中的一行中返回多个具有相同 ID 号的文本字段?

php - 从用户 id 数组中选择帖子 id - mysql

mysql - Excel 2016 在数据中连接到 MySQL 从数据库进行新查询

PHP - PostgreSQL 更新表时出错

mysql - 根据同一个表中的值更新 Mysql 表

sql-server - 是否可以优化或重写此游标以获得最佳性能?

postgresql - 增加 RDS 中的预配置 IOPS 会导致停机?

postgresql - 如何使用 Python 多维数据集返回 2 个维度的聚合值?

mysql - perl脚本同时连接两个数据库