2017-05-25 1 views
1

Je voudrais produire une chaîne contenant des plages numériques analysées.Parse Numeric Ranges dans PostgreSQL

J'ai une table avec des données

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

Utilisation uniquement SQL dans PostgreSQL, comment pourrais-je produire cette sortie:

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

Comment diable dois-je faire cela?

+0

Qu'avez-vous essayé jusqu'à présent? –

Répondre

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 une étape par étape à partir de la requête analyser plus à l'intérieur vers l'extérieur.

+0

S'il vous plaît dites-moi votre adresse postale afin que je puisse vous envoyer une quantité incroyable de bière. Je vous remercie. Ce n'est pas la première fois que tu me sauves, et pendant que j'essaie d'apprendre, je ne suis pas encore là. – Joebocop

+0

Stockez-le dans un endroit frais et buvez à ma santé (pas tout à la fois!) – klin