Sql 按距离划分间隔
我在红移数据库中有一个表,它包含下限为l、上限为u的区间,如下所示: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
| 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