v_start | v_end | v_sorce 17 | 23 | A 150 | 188 | A 200 | 260 | A 19 | 30 | B 105 | 149 | B 199 | 220 | B ...
Ich hätte gerne die Daten so gruppiert das es immer dann eine Zeile gibt wenn sich v_start und v_end aus zwei oder mehreren Zeilen überlappen. Dabei ist es erst mal egal was v_sorce für einen wert hat.
Die Tabelle einfach im SELECT zweimal aufmachen und dann gegenseitig vergleichen. Hier noch ein kleiner Umweg über ROW_NUMBER(), da es in deinem Beispiel keine eindeutige ID für die Datensätze gibt, um diese unterscheiden zu können. Ansonsten würden sich Überlappungen logischerweise auch dann ergeben, wenn der identische Satz in beiden Tabellen verglichen wird.
SELECT a.*, b.* FROM ( SELECT *, ROW_NUMBER() OVER(ORDER BY v_start) AS id FROM tabelle ) a, ( SELECT *, ROW_NUMBER() OVER(ORDER BY v_start) AS id FROM tabelle ) b WHERE a.v_start <= b.v_end AND a.v_end >= b.v_start AND a.id < b.id
Nachtrag: Der Code ist für SQL-Server, bei PostgreSQL sollte es prinzipiell ähnlich klappen.