Sql 按距离划分间隔

Sql 按距离划分间隔,sql,amazon-redshift,Sql,Amazon Redshift,我在红移数据库中有一个表,它包含下限为l、上限为u的区间,如下所示: | interval_id | l | u | | ----------- | -- | -- | | 1 | 1 | 10 | | 2 | 2 | 5 | | 3 | 5 | 15 | | 4 | 26 | 30 | | 5 | 28 | 35 | | 6 | 30 | 31 | | 7

我在红移数据库中有一个表,它包含下限为l、上限为u的区间,如下所示:

| interval_id | l  | u  |
| ----------- | -- | -- |
| 1           | 1  | 10 |
| 2           | 2  | 5  |
| 3           | 5  | 15 |
| 4           | 26 | 30 |
| 5           | 28 | 35 |
| 6           | 30 | 31 |
| 7           | 44 | 45 |
| 8           | 56 | 58 |
我想对这些间隔进行划分,使集合之间至少相隔10。上述示例的预期结果为

| interval_id | l  | u  | group |
| ----------- | -- | -- | ----- |
| 1           | 1  | 10 | A     |
| 2           | 2  | 5  | A     |
| 3           | 5  | 15 | A     |
| 4           | 26 | 30 | B     |
| 5           | 28 | 35 | B     |
| 6           | 30 | 31 | B     |
| 7           | 44 | 45 | B     |
| 8           | 56 | 58 | C     |

例如,前三排属于a组,因为这些层段相互重叠或完全包含,或相距小于10;第4排属于b组,因为其下限距离联管井的上限11,从技术上讲,是间隔1-3的凸包。

Hmmm。我认为您可以取前面所有行的上限的最大值,以查看发生中断的位置。那么,剩下的只是一个累积的总和:

select u.*,
       sum(case when l < prev_max_u + 10 then 0 else 1 end) over (order by l) as groupid
from (select t.*,
             max(u) over (order by l rows between unbounded preceding and 1 preceding)  as prev_max_u
      from t
     ) u;

我通常会使用相关子查询来处理这个问题,但我认为这个公式会起作用。如果有两行完全重复,我可能无法工作。

您的逻辑不清楚。因为一个范围可以与两个组重叠。@JuanCarlosOropeza我希望这些组不是这样的。同样,你需要更详细地解释这一点。重叠很容易确定。但彻底遏制对方并非易事。谁控制谁?相隔10是什么意思,怎么算?18,25是A组还是B组呢?我希望小组作业取决于集合中的时间间隔。如果将[18,25]添加到区间集合中,那么区间1-7和[18,25]都将属于同一组,因为在该区间集合中没有大于10的间隙,只有区间8将位于其自己的组中。因此,您需要按区间id以相同的顺序创建组?你如何衡量这个差距?我认为如果一个区间被包含在另一个区间中,我认为这不会起作用,你也需要考虑L,因为{1,10}和{10,25}应该在同一个组上。我认为,当u