1-288 aralığında bir ad ve tamsayı içeren bir tabloda yaklaşık bir milyar satır veri var. Belirli bir ad için , her int benzersizdir ve aralıktaki her olası tam sayı yoktur - bu nedenle boşluklar vardır.
Bu sorgu bir örnek olay oluşturur:
--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")
Her isim ve bitişik tamsayılar dizisi için bir satır içeren bir arama tablosu oluşturmak istiyorum. Bu satırların her biri şunları içerir:
name - ad sütunu
başlangıcının değeri - bitişik sıra
sonundaki ilk tam sayı - bitişik sıra
aralığındaki son değer - son - başlat + 1
Bu sorgu, yukarıdaki örnek için örnek çıktı oluşturur:
--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)
Çok fazla satırım olduğu için daha verimli olmak daha iyidir. Yani, sadece bir kez bu sorguyu çalıştırmak zorunda dedi, bu yüzden mutlak bir gereklilik değil.
Şimdiden teşekkürler!
Düzenle:
PL / pgSQL çözümlerinin açık olduğunu eklemeliyim (lütfen herhangi bir Fantezi Hileyi açıklayın - PL / pgSQL için hala yeniyim).