首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带连续整数的PostgreSQL unnest()按数字分组

带连续整数的PostgreSQL unnest()按数字分组
EN

Stack Overflow用户
提问于 2017-10-19 15:24:35
回答 2查看 589关注 0票数 1

给定一个不同的有序整数数组,我希望取消数组,并为每一批连续整数分配一个组号。

{2,3,5,7,8,9,10,20,21,25}应返回

代码语言:javascript
运行
复制
elem | group_nr
-----+---------
   2 |  1
   3 |  1
   5 |  2
   7 |  3
   8 |  3
   9 |  3
  10 |  3
  20 |  4
  21 |  4
  25 |  5
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-19 15:41:50

使用窗口函数 lag()sum()

代码语言:javascript
运行
复制
with the_data(arr) as (
values (array[2,3,5,7,8,9,10,20,21,25])
)

select elem, sum(diff) over w as group_nr
from (
    select elem, (elem- 1 is distinct from lag(elem) over w)::int as diff
    from the_data, unnest(arr) as elem
    window w as (order by elem)
    ) s
window w as (order by elem);

 elem | group_nr 
------+----------
    2 |        1
    3 |        1
    5 |        2
    7 |        3
    8 |        3
    9 |        3
   10 |        3
   20 |        4
   21 |        4
   25 |        5
(10 rows)   
票数 2
EN

Stack Overflow用户

发布于 2017-10-19 15:40:31

取消嵌套后使用lag获取当前和上一行值的差异,然后使用运行和分配组号。

代码语言:javascript
运行
复制
select id,num,sum(col) over(partition by id order by num) as grp
from (select id,num,case when num-lag(num,1,0) over(partition by id order by num)=1 then 0 else 1 end as col
      from (select id,unnest(array_column) as num from tbl) t
     ) t
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46833454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档