簡體   English   中英

匯總數字,一些在范圍內

[英]Aggregate numbers, some in ranges

我的數字列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;

如果我理解正確,您將使用兩個級別的聚合。 第一個獲取范圍:

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
     ) x

是一個 db<>fiddle 說明此邏輯有效。

修復語法錯誤並正確轉換后,相同的查詢在 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<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM