Tôi đã có khoảng một tỷ hàng dữ liệu trong một bảng có tên và số nguyên trong phạm vi 1-288. Đối với một tên cụ thể , mọi int là duy nhất và không phải mọi số nguyên có thể có trong phạm vi đều có mặt - vì vậy có những khoảng trống.
Truy vấn này tạo ra một trường hợp ví dụ:
--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")
Tôi muốn tạo một bảng tra cứu với một hàng cho mỗi tên và chuỗi các số nguyên liền kề. Mỗi hàng như vậy sẽ chứa:
tên - giá trị của cột tên
bắt đầu - số nguyên đầu tiên trong
kết thúc chuỗi liên tục - giá trị cuối cùng trong
khoảng trình tự liền kề - kết thúc - bắt đầu + 1
Truy vấn này tạo đầu ra ví dụ cho ví dụ trên:
--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)
Bởi vì tôi có rất nhiều hàng, hiệu quả hơn là tốt hơn. Điều đó nói rằng, tôi chỉ phải chạy truy vấn này một lần, vì vậy nó không phải là một yêu cầu tuyệt đối.
Cảm ơn trước!
Chỉnh sửa:
Tôi nên thêm rằng các giải pháp PL / pgQuery đều được chào đón (vui lòng giải thích mọi Thủ thuật Fancy - Tôi vẫn chưa quen với PL / pgQuery).