Eu tenho uma tabela com números como este (o status é GRATUITO ou ATRIBUÍDO)
id_set number status ----------------------- 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
Ele deve retornar apenas o primeiro grupo possível de cada id_set (na verdade, seria executado apenas para id_set por consulta)
Eu estava checando as funções do WINDOW, tentei algumas consultas 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 as funções do WINDOW, contando as linhas anteriores para cada número em que status = 'FREE' e, em seguida, selecione o primeiro número, em que a 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 que contenham pelo menos "n" números
EDITAR
Encontrei esta consulta (e a alterei 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 GRATUITOS / ATRIBUÍDOS, mas eu gostaria de ter todos os números do primeiro grupo que atenda à condição