Obtain a concise string of the numbers, for example, given 1,2,3,6,7,8,9,12,14, we expect 1-3,6-9,12,14.
Here is the Table:
x
create table tt8 (c1 numeric);
insert into tt8 values
(1),(2),(3),(6),(7),(8),(9),(12),(14);
Use Table tt8, Here is what the result should look like:
numbers
---------------
1-3,6-9,12,14
Here is what I have so far, but it’s giving me type error. I don’t think this is the correct way.
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;
Advertisement
Answer
You can use a gaps-and-islands approach and then aggregation. The following gets the groups:
select min(c1) || (case when count(*) = 1 then '' else '-' || max(c1) end)
from (select tt8.*, row_number() over (order by c1) as seqnum
from tt8
) t
group by (c1 - seqnum);
You can then put them into a single string:
select string_agg(val, ',' order by min_c1)
from (select min(c1) || (case when count(*) = 1 then '' else '-' || max(c1) end) as val, min(c1) as min_c1
from (select tt8.*, row_number() over (order by c1) as seqnum
from tt8
) t
group by (c1 - seqnum)
) t;
Here is a db<>fiddle.