Mam około miliarda wierszy danych w tabeli z nazwą i liczbą całkowitą z zakresu 1-288. Dla danej nazwy , każdy int jest wyjątkowy, a nie każdy możliwy całkowitą w przedziale jest obecny - tak istnieją luki.
To zapytanie generuje przykładowy przypadek:
--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")
Chciałbym wygenerować tablicę przeglądową z wierszem dla każdej nazwy i sekwencji ciągłych liczb całkowitych. Każdy taki wiersz zawierałby:
Nazwa - wartość nazwa kolumny
początku - pierwszy całkowitą w ciągłej sekwencji
końca - wartość końcowa w ciągłej sekwencji
rozpiętości - koniec - początek + 1
To zapytanie generuje przykładowe dane wyjściowe dla powyższego przykładu:
--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)
Ponieważ mam tak wiele wierszy, bardziej wydajne jest lepsze. To powiedziawszy, muszę uruchomić to zapytanie tylko raz, więc nie jest to absolutny wymóg.
Z góry dziękuję!
Edytować:
Powinienem dodać, że rozwiązania PL / pgSQL są mile widziane (proszę wyjaśnić wszelkie fantazyjne sztuczki - wciąż jestem nowy w PL / pgSQL).