나는 이와 같은 숫자가있는 테이블을 가지고 있습니다 (상태는 FREE 또는 ASSIGNED입니다)
id_set 번호 상태 ----------------------- 1 000001 할당 1 000002 무료 1 000003 할당 1 000004 무료 1 000005 무료 1 000006 할당 1 000007 할당 1 000008 무료 1 000009 무료 1 000010 무료 1 000011 지정 1 000012 할당 1 000013 할당 1 000014 무료 1 000015 할당
"n"연속 숫자를 찾아야하므로 n = 3 인 경우 쿼리가 반환됩니다.
1 000008 무료 1 000009 무료 1 000010 무료
각 id_set의 첫 번째 가능한 그룹 만 반환해야합니다 (실제로 쿼리 당 id_set에 대해서만 실행 됨)
WINDOW 함수를 확인하고 같은 쿼리를 시도 COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
했지만 그게 전부입니다 :) 논리를 생각할 수 없었습니다 .Postgres에서 그렇게하는 방법.
status = 'FREE'인 모든 숫자에 대해 선행 행을 계산하는 WINDOW 함수를 사용하여 가상 열을 생성 한 다음 count가 내 "n"숫자와 동일한 첫 번째 숫자를 선택하려고했습니다.
또는 상태별로 그룹 번호를 지정할 수 있지만 한 ASSIGNED에서 다른 ASSIGNED로만 그룹 번호를 지정하고 "n"이상의 숫자를 포함하는 그룹 만 선택하십시오.
편집하다
이 쿼리를 찾았으며 조금 변경했습니다.
WITH q AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY id_set, status ORDER BY number) AS rnd,
ROW_NUMBER() OVER (PARTITION BY id_set ORDER BY number) AS rn
FROM numbers
)
SELECT id_set,
MIN(number) AS first_number,
MAX(number) AS last_number,
status,
COUNT(number) AS numbers_count
FROM q
GROUP BY id_set,
rnd - rn,
status
ORDER BY
first_number
FREE / ASSIGNED 번호 그룹을 생성하지만 조건을 충족하는 첫 번째 그룹의 모든 번호를 원합니다.