2017-05-25 2 views
1

Ich möchte eine Zeichenfolge mit einigen analysierten numerischen Bereichen erzeugen.Parse Numerische Bereiche in PostgreSQL

Ich habe eine Tabelle mit einigen Daten

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

nur SQL in PostgreSQL verwenden, wie könnte ich diese Ausgabe erzeugen:

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

Wie auf der Erde kann ich das tun?

+0

Was haben Sie bisher versucht? –

Antwort

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 ein Schritt-für-Schritt von der innersten Abfrage nach außen hin analysieren.

+0

Bitte teilen Sie mir Ihre Postadresse mit, damit ich Ihnen eine unglaubliche Menge Bier senden kann. Vielen Dank. Nicht das erste Mal, dass du mich gerettet hast, und während ich versuche zu lernen, bin ich noch nicht "da". – Joebocop

+0

Lagern Sie es an einem kalten Ort und trinken Sie zu meiner Gesundheit (nicht alles auf einmal!) – klin