Ich habe eine Tabelle mit Zahlen wie dieser (Status ist entweder FREI oder ZUGEWIESEN)
ID_SET-Nummernstatus ----------------------- 1 000001 ZUGEWIESEN 1 000002 KOSTENLOS 1 000003 ZUGEWIESEN 1 000004 KOSTENLOS 1 000005 KOSTENLOS 1 000006 ZUGEWIESEN 1 000007 ZUGEWIESEN 1 000008 KOSTENLOS 1 000009 KOSTENLOS 1 000010 KOSTENLOS 1 000011 ZUGEWIESEN 1 000012 ZUGEWIESEN 1 000013 ZUGEWIESEN 1 000014 KOSTENLOS 1 000015 ZUGEWIESEN
und ich muss "n" aufeinanderfolgende Zahlen finden, so dass für n = 3 die Abfrage zurückkehren würde
1 000008 KOSTENLOS 1 000009 KOSTENLOS 1 000010 KOSTENLOS
Es sollte nur die erste mögliche Gruppe jedes id_set zurückgeben (tatsächlich würde es nur für id_set pro Abfrage ausgeführt).
Ich habe WINDOW-Funktionen überprüft, einige Abfragen ausprobiert COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
, aber das ist alles, was ich habe :) Mir fiel keine Logik ein, wie man das in Postgres macht.
Ich habe darüber nachgedacht, eine virtuelle Spalte mit WINDOW-Funktionen zu erstellen, indem ich die vorhergehenden Zeilen für jede Nummer gezählt habe, bei der status = 'FREE' ist, und dann die erste Nummer ausgewählt habe, bei der count gleich meiner "n" -Nummer ist.
Oder gruppieren Sie Nummern nach Status, aber nur von einem ZUGEWIESENEN zu einem anderen ZUGEWIESENEN, und wählen Sie nur Gruppen aus, die mindestens "n" Nummern enthalten
BEARBEITEN
Ich habe diese Abfrage gefunden (und ein wenig geändert)
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
das produziert Gruppen von FREE / ASSIGNED-Nummern, aber ich möchte alle Nummern nur von der ersten Gruppe haben, die die Bedingung erfüllt