获取一个简洁的数字字符串,例如,给定1,2,3,6,7,8,9,12,14,我们期望1-3,6-9,12,14。
这是table:
create table tt8 (c1 numeric);
insert into tt8 values
(1),(2),(3),(6),(7),(8),(9),(12),(14);
使用表tt8,结果如下:
numbers
---------------
1-3,6-9,12,14
这是我到目前为止得到的,但它给了我类型错误。我认为这不是正确的方法。
select c1,
case
when c1 = 1|2|3 then '1-3'
when c1 = 6|7|8|9 then '6-9'
else c1
end
from tt8;
2条答案
按热度按时间agxfikkp1#
您可以使用间隙和孤岛方法,然后进行聚合。以下内容获取组:
然后可以将它们放入一个字符串中:
这是一把小提琴。
0s0u357o2#
请尝试一下:
您可以更改最后一个查询以返回每个cte的结果,以查看发生了什么。
trans
使用lag()
用于标记以组开头的行的窗口函数:c1 | grpnum
----+--------
1 | 1
2 | 1
3 | 1
6 | 2
7 | 2
8 | 2
9 | 2
12 | 3
14 | 4
(9 rows)
```
ranges
折叠每个groupnum
到它的min()
以及max()
:grpnum | txt
--------+-----
3 | 12
4 | 14
2 | 6-9
1 | 1-3
(4 rows)