Ich habe ungefähr eine Milliarde Datenzeilen in einer Tabelle mit einem Namen und einer Ganzzahl im Bereich von 1-288. Für einen bestimmten Namen ist jedes int eindeutig, und nicht jede mögliche Ganzzahl im Bereich ist vorhanden - daher gibt es Lücken.
Diese Abfrage generiert einen Beispielfall:
--what I have:
SELECT *
FROM ( VALUES ('foo', 2),
('foo', 3),
('foo', 4),
('foo', 10),
('foo', 11),
('foo', 13),
('bar', 1),
('bar', 2),
('bar', 3)
) AS baz ("name", "int")
Ich möchte eine Nachschlagetabelle mit einer Zeile für jeden Namen und jede Folge zusammenhängender Ganzzahlen generieren. Jede solche Zeile würde enthalten:
Name - der Wert des Namens
Spaltenstart - die erste Ganzzahl in der zusammenhängenden Sequenz
Ende - der letzte Wert in der zusammenhängenden Sequenz
Spanne - Ende - Anfang + 1
Diese Abfrage generiert eine Beispielausgabe für das obige Beispiel:
--what I need:
SELECT *
FROM ( VALUES ('foo', 2, 4, 3),
('foo', 10, 11, 2),
('foo', 13, 13, 1),
('bar', 1, 3, 3)
) AS contiguous_ranges ("name", "start", "end", span)
Weil ich so viele Zeilen habe, ist effizienter besser. Das heißt, ich muss diese Abfrage nur einmal ausführen, es ist also nicht unbedingt erforderlich.
Danke im Voraus!
Bearbeiten:
Ich sollte hinzufügen, dass PL / pgSQL-Lösungen willkommen sind (bitte erläutern Sie alle Fancy Tricks - ich bin noch neu in PL / pgSQL).