1-288 범위의 이름과 정수를 가진 테이블에 약 10 억 행의 데이터가 있습니다. 주어진 name 에 대해, 모든 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을 처음 사용합니다).