首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合计数字,有些在范围内

合计数字,有些在范围内
EN

Stack Overflow用户
提问于 2020-06-27 06:50:47
回答 2查看 74关注 0票数 1

我的数值列c1中有一个表tab1,其中包含以下值

代码语言:javascript
复制
1
2
3
4
5
6
7
8
9
10
13
18

我想返回。

代码语言:javascript
复制
1-5
6-10
13
18

下面的查询在MySQL中成功执行,但在PostgreSQL中不成功:

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

发布于 2020-06-27 06:54:10

如果我理解正确的话,您应该使用两个级别的聚合。第一个获取范围:

代码语言:javascript
复制
select min(c1), max(c1)
from (select t.*, row_number() over (order by c1) as seqnum
      from t
     ) t
group by c1 - seqnum;

第二个然后重新聚合它:

代码语言:javascript
复制
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
     ) x

Here是一个说明此逻辑工作的db<>fiddle。

票数 1
EN

Stack Overflow用户

发布于 2020-06-27 07:53:06

在修复语法错误并进行适当的类型转换后,Postgres中也可以使用相同的查询:

代码语言:javascript
复制
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中的首选类型。但是,按字符串表示进行排序对您的数字没有好处。因此,我建议使用以下替代方法来进行适当的排序:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62603876

复制
相关文章

相似问题

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