Saya punya sekitar satu miliar baris data dalam sebuah tabel dengan nama dan bilangan bulat dalam kisaran 1-288. Untuk nama yang diberikan , setiap int adalah unik, dan tidak setiap bilangan bulat yang mungkin ada dalam jajaran - jadi ada celah.
Kueri ini menghasilkan contoh kasus:
--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")
Saya ingin membuat tabel pencarian dengan baris untuk setiap nama dan urutan bilangan bulat yang berdekatan. Setiap baris akan berisi:
nama - nilai awal kolom nama - bilangan bulat pertama di akhir urutan yang berdekatan - nilai akhir dalam rentang urutan yang berdekatan - akhir - mulai + 1
Kueri ini menghasilkan contoh output untuk contoh di atas:
--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)
Karena saya memiliki begitu banyak baris, lebih efisien lebih baik. Yang mengatakan, saya hanya perlu menjalankan permintaan ini sekali, jadi itu bukan persyaratan mutlak.
Terima kasih sebelumnya!
Edit:
Saya harus menambahkan bahwa solusi PL / pgSQL dipersilakan (tolong jelaskan Trik Fancy - Saya masih baru untuk PL / pgSQL).