表中的组范围包含非基于时间的开始和结束列

时间:2017-08-01 19:53:54

标签: sql database postgresql

我需要根据双精度开始和结束列找到它们之间可能存在间隙的连续数据点中的范围。

为简单起见,我们将其称为 startPoint endPoint ,它们会跟踪某一行的位置。 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   |
| 6  | 12.1       | 12.9     | Active   |

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

| startGap   | endGap   | state    |
|------------|----------|----------|
| 0.0        | 5.8      | Active   |
| 5.8        | 7.1      | Inactive |
| 7.5        | 11.3     | Inactive |
| 11.6       | 12.9     | Active   |

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

嗯。嗯。 。 。您可以使用lag()确定组的开始位置,然后使用累计总和:

select min(startPoint) as startPoint, max(endPoint) as endPoint, state
from (select t.*,
             sum( (prev_endPoint is distinct from startPoint)::int) over () as grp
      from (select t.*,
                   lag(endPoint) over (partition by state order by startPoint) as prev_endPoint
            from t
           ) t
     ) t
group by state, grp;

老实说,浮点数是相当危险的,因为两个看起来是一样的。定义sum()的{​​{1}}可能更好地写为:

grp

我还建议您切换到定点表示(数字)而不是浮点。