Tengo alrededor de mil millones de filas de datos en una tabla con un nombre y un número entero en el rango 1-288. Para un nombre dado , cada int es único, y no todos los enteros posibles en el rango están presentes, por lo que hay huecos.
Esta consulta genera un caso de ejemplo:
--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")
Me gustaría generar una tabla de búsqueda con una fila para cada nombre y secuencia de enteros contiguos. Cada una de esas filas contendría:
nombre - el valor del comienzo de la columna de nombre - el primer entero en el final de la secuencia contigua - el valor final en el intervalo de la secuencia contigua - final - inicio + 1
Esta consulta genera resultados de ejemplo para el ejemplo anterior:
--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)
Debido a que tengo tantas filas, más eficiente es mejor. Dicho esto, solo tengo que ejecutar esta consulta una vez, por lo que no es un requisito absoluto.
¡Gracias por adelantado!
Editar:
Debo agregar que las soluciones PL / pgSQL son bienvenidas (explique cualquier truco de fantasía: todavía soy nuevo en PL / pgSQL).