[英]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.