このような数字のテーブルがあります(ステータスはFREEまたはASSIGNEDです)
id_set番号ステータス ----------------------- 1 000001割り当て済み 1 000002無料 1 000003割り当て済み 1 000004無料 1 000005無料 1 000006割り当て済み 10007割り当て済み 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関数を使用して仮想列を作成し、最初の番号を選択することを考えていました。
または、ステータスごとに番号をグループ化しますが、1つの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番号のグループを生成しますが、条件に一致する最初のグループのみからすべての番号を取得したいです