Я отримав близько мільярда рядків даних у таблиці з іменем та цілим числом в діапазоні 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).