Sql Postgres:具有自动增量的范围查找
我有下表:表1Sql Postgres:具有自动增量的范围查找,sql,postgresql,Sql,Postgresql,我有下表:表1 begin | value | end --------------------- 1 | 3 | 10 1 | 5 | 10 1 | 2 | 10 1 | 7 | 10 11 | 19 | 20 11 | 16 | 20 11 | 14 | 20 我正在寻找以下输出: begin | value | end | case ----------------------------
begin | value | end
---------------------
1 | 3 | 10
1 | 5 | 10
1 | 2 | 10
1 | 7 | 10
11 | 19 | 20
11 | 16 | 20
11 | 14 | 20
我正在寻找以下输出:
begin | value | end | case
-----------------------------
1 | 3 | 10 | 1
1 | 5 | 10 | 1
1 | 2 | 10 | 1
1 | 7 | 10 | 1
11 | 19 | 20 | 2
11 | 16 | 20 | 2
11 | 14 | 20 | 2
我想为特定范围内的数字指定一个唯一的数字,但我无法找到解决方法。有什么建议吗?Hmmm。这是一个缺口和孤岛问题。您可以通过检查是否没有其他行与孤岛重叠来确定孤岛的起始位置。为此,可以使用累计最大值 这让你接近:
select t.*,
count(*) filter where (prev_end < start) over (order by start) as grp
from (select t.*,
max(end) over (order by start range between unbounded preceding and 1 preceding) as prev_end
from t
) t;
然而,数据中的联系意味着这有差距。因此,还有一个层面:
select t.*, dense_rank() over (order by grp) as sequential_grp
from (select t.*,
count(*) filter (where prev_end < start) over (order by start) as grp
from (select t.*,
max(end) over (order by start range between unbounded preceding and 1 preceding) as prev_end
from t
) t
) t;
因为像begin和end这样的名称都是SQL关键字,所以列名不是一个好主意。为什么不直接选择*,按begin的顺序密集排列作为数据的大小写?