Tengo una tabla con números como este (el estado es GRATUITO o ASIGNADO)
id_set number status ----------------------- 1 000001 ASIGNADO 1 000002 GRATIS 1 000003 ASIGNADO 1 000004 GRATIS 1 000005 GRATIS 1 000006 ASIGNADO 1 000007 ASIGNADO 1 000008 GRATIS 1 000009 GRATIS 1 000010 GRATIS 1 000011 ASIGNADO 1 000012 ASIGNADO 1 000013 ASIGNADO 1 000014 GRATIS 1 000015 ASIGNADO
y necesito encontrar "n" números consecutivos, por lo que para n = 3, la consulta devolvería
1 000008 GRATIS 1 000009 GRATIS 1 000010 GRATIS
Debería devolver solo el primer grupo posible de cada id_set (de hecho, se ejecutaría solo para id_set por consulta)
Estaba comprobando las funciones de WINDOW, intenté algunas consultas como COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
, pero eso es todo lo que obtuve :) No podía pensar en la lógica, cómo hacer eso en Postgres.
Estaba pensando en crear una columna virtual usando las funciones de VENTANA contando las filas anteriores para cada número donde status = 'FREE', luego seleccione el primer número, donde count es igual a mi número "n".
O quizás agrupe los números por estado, pero solo de un ASIGNADO a otro ASIGNADO y seleccione solo grupos que contengan al menos "n" números
EDITAR
Encontré esta consulta (y la cambié un poco)
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
que produce grupos de números GRATUITOS / ASIGNADOS, pero me gustaría tener todos los números del primer grupo que cumpla la condición