Ho una tabella con numeri come questo (lo stato è GRATUITO o ASSEGNATO)
stato numero id_set ----------------------- 1 000001 ASSEGNATO 1 000002 GRATIS 1 000003 ASSEGNATO 1 000004 GRATIS 1 000005 GRATUITO 1 000006 ASSEGNATO 1 000007 ASSEGNATO 1 000008 GRATIS 1 000009 GRATUITO 1 000010 GRATIS 1 000011 ASSEGNATO 1 000012 ASSEGNATO 1 000013 ASSEGNATO 1 000014 GRATIS 1 000015 ASSEGNATO
e ho bisogno di trovare "n" numeri consecutivi, quindi per n = 3, la query ritornerebbe
1 000008 GRATIS 1 000009 GRATUITO 1 000010 GRATIS
Dovrebbe restituire solo il primo gruppo possibile di ciascun id_set (in effetti, verrebbe eseguito solo per id_set per query)
Stavo controllando le funzioni di WINDOW, ho provato alcune domande del genere COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
, ma è tutto ciò che ho ottenuto :) Non riuscivo a pensare alla logica, a come farlo in Postgres.
Stavo pensando di creare una colonna virtuale usando le funzioni di WINDOW contando le righe precedenti per ogni numero dove status = 'FREE', quindi selezionare il primo numero, dove count è uguale al mio numero "n".
O forse raggruppare i numeri per stato, ma solo da un ASSEGNATO ad un altro ASSEGNATO e selezionare solo i gruppi contenenti almeno "n" numeri
MODIFICARE
Ho trovato questa query (e l'ho cambiata un po ')
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
che produce gruppi di numeri LIBERI / ASSEGNATI, ma vorrei avere tutti i numeri solo dal primo gruppo che soddisfa la condizione