postgresql查询:编写一个查询来返回每组连续数字的最大值

wecizke3  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(322)

这个问题在这里已经有了答案

postgresql给出“1,2,3,6,7,8,11,12,15,18,19,20”,一个查询返回每组连续数字的最大值(1个答案)
10个月前关门了。
给定一组数字,如“1,2,3,6,7,8,11,12,15,18,19,20”,编写一个查询以返回每组连续数字的最大值。
首先需要找出哪些数字应该在一个组中,然后找出每个组中的最大值。

create table tt (c1 numeric);
insert into tt values
(1),(2),(3),(6),(7),(8),(11),(12),(15),(18),(19),(20);

所以答案是3,8,12,15,20

7fyelxc5

7fyelxc51#

我不能重复结束这个问题,但我可以在这里复制我的答案:假设你想要3、8、12、15和20,你可以使用lead():

select c1
from (select t.*, lead(c1) over (order by c1) as next_c1
      from table1 t
     ) t
where next_c1 is distinct from c1 + 1;

它使用的观察结果是,您可以通过将“下一个数字”与当前值加1进行比较来找到结束数字。
如果您希望这些字符串:

select string_agg(c1::text, ',' order by c1)

这是一把小提琴。

j9per5c4

j9per5c42#

我将你的问题改为:获取下一个值不按顺序排列的数字。如果是这样,您可以只使用窗口函数:

select *
from (select c1, lead(c1) over(order by c1) lead_c1 from tt) t
where lead_c1 <> c1 + 1

对于示例数据,这将生成:

c1 | lead_c1
-: | ------:
 3 |       6
 8 |      11
12 |      15
15 |      18

如果您还想捕获最后一条记录(显然,它没有跟随者),您可以更改 where 条款至:

where lead_c1 <> c1 + 1 or lead_c1 is null

相关问题