2017-05-25 71 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