2017-08-01 64 views
0

我需要根据双精度开始和结束列找到连续数据点中的空位。使用非基于时间的开始和结束列查找表中的空缺

为了简单起见,让我们称他们为的startPoint端点其跟踪的线在空间中的位置。 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 | 

我一直在努力拿出在PostgreSQL的工作一个查询,得到以下结果:

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

这是清楚我所要做的就是将以前的endPoint与以下startPoint进行比较,但迄今为止我还没有运气。

任何帮助将不胜感激。

+2

为什么MySQL的标签? – Strawberry

回答

1

使用窗函数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) 
1

已测试使用SQL小提琴:http://sqlfiddle.com/#!9/2851c3/2/0(我显然认为这是MySQL的一些原因)

很可能不是最有效的,因为它具有运行每条记录的子查询中一个不太最大...

实质上,这会做一个LEFT OUTER自连接以从B的起点开始,并且在未找到连接中的匹配的位置处,我们确定成为起点的终点。然后我们使用子查询来查找超过该值的最小起始点

我们排除最后一条记录的起点最高,因为我们知道在最后一条记录之后没有找到间隙。

这并不假定数据重叠。

SELECT A.EndPoint as StartGap 
    , (SELECT min(StartPoint) 
     FROM sqlfoo 
     WHERE StartPoint > A.EndPoint) as EndGap 
FROM sqlfoo A 
LEFT JOIN sqlfoo B 
on A.EndPoint = B.StartPoint 
WHERE B.StartPoint is null 
    and A.StartPoint <> (SELECT max(startPoint) FROM sqlfoo) 

这identifes最大启动

+0

那么原因是标签是mysql:/ –

相关问题