Ho circa un miliardo di righe di dati in una tabella con un nome e un numero intero nell'intervallo 1-288. Per un determinato nome , ogni int è univoco e non tutti i possibili numeri interi nell'intervallo sono presenti, quindi esistono degli spazi vuoti.
Questa query genera un caso di esempio:
--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")
Vorrei generare una tabella di ricerca con una riga per ogni nome e sequenza di numeri interi contigui. Ciascuna di queste righe dovrebbe contenere:
nome - il valore del nome colonna
inizio - il primo intero nella sequenza contigua
fine - il valore finale della sequenza contigua
campata - fine - inizio + 1
Questa query genera un output di esempio per l'esempio precedente:
--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)
Perché ho così tante file, più efficiente è meglio. Detto questo, devo eseguire questa query una sola volta, quindi non è un requisito assoluto.
Grazie in anticipo!
Modificare:
Dovrei aggiungere che le soluzioni PL / pgSQL sono benvenute (per favore spiegate qualsiasi trucco di fantasia - Sono ancora nuovo a PL / pgSQL).