У меня есть около миллиарда строк данных в таблице с именем и целым числом в диапазоне 1-288. Для данного имени каждое int уникально, и не каждое возможное целое число в диапазоне присутствует - поэтому есть пробелы.
Этот запрос генерирует пример случая:
--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")
Я хотел бы создать таблицу поиска со строкой для каждого имени и последовательности непрерывных целых чисел. Каждая такая строка будет содержать:
Имя - значение имени столбца
начала - первое целое число в пределах последовательности
конца - конечное значение в непрерывной последовательности
диапазона - конец - старт + 1
Этот запрос генерирует пример вывода для приведенного выше примера:
--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)
Потому что у меня так много строк, чем эффективнее, тем лучше. Тем не менее, я должен выполнить этот запрос только один раз, так что это не является абсолютным требованием.
Заранее спасибо!
Редактировать:
Я должен добавить, что решения PL / pgSQL приветствуются (пожалуйста, объясните любые хитрые уловки - я все еще новичок в PL / pgSQL).