Eu tenho algumas tabelas com números como este (status é FREE ou ASSIGNED)
status do número id_set ----------------------- 1 000001 ATRIBUÍDO 1 000002 GRÁTIS 1 000003 ATRIBUÍDO 1 000004 GRÁTIS 1 000005 GRÁTIS 1 000006 ATRIBUÍDO 1 000007 ATRIBUÍDO 1 000008 GRÁTIS 1 000009 GRÁTIS 1 000010 GRÁTIS 1 000011 ATRIBUÍDO 1 000012 ATRIBUÍDO 1 000013 ATRIBUÍDO 1 000014 GRÁTIS 1 000015 ATRIBUÍDO
e eu preciso encontrar "n" números consecutivos, então para n = 3, a consulta retornaria
1 000008 GRÁTIS 1 000009 GRÁTIS 1 000010 GRÁTIS
Deve retornar apenas o primeiro grupo possível de cada id_set (na verdade, seria executado apenas para id_set por consulta)
Eu estava verificando as funções do WINDOW, tentei algumas consultas como COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
, mas foi tudo o que consegui :) Não consegui pensar em lógica, como fazer isso no Postgres.
Eu estava pensando em criar uma coluna virtual usando funções WINDOW contando linhas anteriores para cada número em que status = 'FREE' e, em seguida, selecione o primeiro número, onde contagem é igual ao meu número "n".
Ou talvez agrupe números por status, mas apenas de um ASSIGNED para outro ASSIGNED e selecione apenas grupos contendo pelo menos "n" números
EDITAR
Eu encontrei esta consulta (e mudei um pouco)
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 produz grupos de números FREE/ASSIGNED, mas gostaria de ter todos os números apenas do primeiro grupo que atende à condição