2017-05-25 76 views
1

我想生成一個包含一些分析數值範圍的字符串。解析PostgreSQL中的數值範圍

我有一些數據

b_id,s_id 
1,50 
1,51 
1,53 
1,61 
1,62 
1,63 
2,91 
2,95 
2,96 
2,97 

使用PostgreSQL只SQL表,我怎麼會產生這樣的輸出:

b_id,s_seqs 
1,"50-51,53,61-63" 
2,"91,95-97" 

如何在地球上我該怎麼辦呢?

+0

你到目前爲止嘗試過什麼? –

回答

2
select b_id, string_agg(seq, ',' order by seq_no) as s_seqs 
from (
    select 
     b_id, seq_no, 
     replace(regexp_replace(string_agg(s_id::text, ','), ',.+,', '-'), ',', '-') seq 
    from (
     select 
      b_id, s_id, 
      sum(mark) over w as seq_no 
     from (
      select 
       b_id, s_id, 
       (s_id- 1 <> lag(s_id, 1, s_id) over w)::int as mark 
      from my_table 
      window w as (partition by b_id order by s_id) 
      ) s 
     window w as (partition by b_id order by s_id) 
     ) s 
    group by 1, 2 
    ) s 
group by 1; 

Here you can find從最裏面的查詢到外面的一步一步的分析。

+0

請告訴我你的郵寄地址,這樣我可以給你一個難以置信的數量的啤酒。謝謝。不是你第一次救了我,當我正在努力學習的時候,我還沒有「那裏」。 – Joebocop

+0

將它存放在寒冷的地方,飲用我的健康(不是一次性的)! – klin