ฉันมีข้อมูลประมาณหนึ่งพันล้านแถวในตารางที่มีชื่อและจำนวนเต็มในช่วง 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)