我的数值列c1中有一个表tab1,其中包含以下值
1
2
3
4
5
6
7
8
9
10
13
18我想返回。
1-5
6-10
13
18下面的查询在MySQL中成功执行,但在PostgreSQL中不成功:
select distinct
case
when c1 between 1 and 5 then '1-5'
when c1 between 6 and 9 then '6-10'
else c1
end as 'c1'
from tab1;发布于 2020-06-27 06:54:10
如果我理解正确的话,您应该使用两个级别的聚合。第一个获取范围:
select min(c1), max(c1)
from (select t.*, row_number() over (order by c1) as seqnum
from t
) t
group by c1 - seqnum;第二个然后重新聚合它:
select string_agg(range, ',' order by min_c1)
from (select (case when min(c1) <> max(c1) then min(c1) || '-' || max(c1) else min(c1)::text end) as range, min(c1) as min_c1
from (select t.*, row_number() over (order by c1) as seqnum
from t
) t
group by c1 - seqnum
) xHere是一个说明此逻辑工作的db<>fiddle。
发布于 2020-06-27 07:53:06
在修复语法错误并进行适当的类型转换后,Postgres中也可以使用相同的查询:
SELECT DISTINCT
CASE WHEN c1 BETWEEN 1 AND 5 THEN '1-5'
WHEN c1 BETWEEN 6 AND 9 THEN '6-10'
ELSE c1::text END AS c1
FROM tab1;结果必须是字符串类型- text是Postgres中的首选类型。但是,按字符串表示进行排序对您的数字没有好处。因此,我建议使用以下替代方法来进行适当的排序:
SELECT CASE WHEN c1 BETWEEN 1 AND 5 THEN '1-5'
WHEN c1 BETWEEN 6 AND 9 THEN '6-10'
ELSE c1::text END AS new_c1 -- avoid duplicate of source name
FROM tab1 t
GROUP BY new_c1
ORDER BY min(t.c1);db<>fiddle
https://stackoverflow.com/questions/62603876
复制相似问题