PostgreSQL查询:写一个查询return每组连续数的最大值
PostgreSQL query: write a query to return the maximum of each group of consecutive numbers
给定一组数字,例如“1,2,3,6,7,8,11,12,15,18,19,20”,写一个查询 return 每个数字的最大值一组连续的数字。
需要先找出一组中应该有哪些数字,然后找出每组中的最大值。
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
我会将您的问题改写为:获取下一个值不按顺序排列的数字。如果是这样,您可以只使用 window 函数:
select *
from (select c1, lead(c1) over(order by c1) lead_c1 from tt) t
where lead_c1 <> c1 + 1
对于您的示例数据,this produces:
c1 | lead_c1
-: | ------:
3 | 6
8 | 11
12 | 15
15 | 18
如果您还想捕获最后一条记录(显然没有跟随者),您可以将 where
子句更改为:
where lead_c1 <> c1 + 1 or lead_c1 is null
我无法将此问题作为 duplicate 关闭,但我可以在此处复制我的答案:
假设您想要 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)
Here 是一个 db<>fiddle.
给定一组数字,例如“1,2,3,6,7,8,11,12,15,18,19,20”,写一个查询 return 每个数字的最大值一组连续的数字。
需要先找出一组中应该有哪些数字,然后找出每组中的最大值。
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
我会将您的问题改写为:获取下一个值不按顺序排列的数字。如果是这样,您可以只使用 window 函数:
select *
from (select c1, lead(c1) over(order by c1) lead_c1 from tt) t
where lead_c1 <> c1 + 1
对于您的示例数据,this produces:
c1 | lead_c1 -: | ------: 3 | 6 8 | 11 12 | 15 15 | 18
如果您还想捕获最后一条记录(显然没有跟随者),您可以将 where
子句更改为:
where lead_c1 <> c1 + 1 or lead_c1 is null
我无法将此问题作为 duplicate 关闭,但我可以在此处复制我的答案: 假设您想要 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)
Here 是一个 db<>fiddle.