Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres:具有自动增量的范围查找_Sql_Postgresql - Fatal编程技术网

Sql Postgres:具有自动增量的范围查找

Sql 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 ----------------------------

我有下表:表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
-----------------------------
  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的顺序密集排列作为数据的大小写?