Eu tenho cerca de um bilhão de linhas de dados em uma tabela com um nome e um número inteiro no intervalo de 1 a 288. Para um determinado nome , todo int é único e nem todo número possível do intervalo está presente - portanto, existem lacunas.
Esta consulta gera um exemplo de caso:
--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")
Gostaria de gerar uma tabela de pesquisa com uma linha para cada nome e sequência de números inteiros contíguos. Cada linha conteria:
name - o valor do início da coluna de nome - o primeiro número inteiro no final da sequência contígua - o valor final no período de sequência contígua - end - start + 1
Esta consulta gera saída de exemplo para o exemplo acima:
--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)
Como tenho muitas linhas, mais eficiente é melhor. Dito isto, só preciso executar esta consulta uma vez, portanto não é um requisito absoluto.
Desde já, obrigado!
Editar:
Devo acrescentar que as soluções PL / pgSQL são bem-vindas (por favor, explique quaisquer truques extravagantes - ainda sou novo no PL / pgSQL).