J'ai un tableau avec des chiffres comme celui-ci (le statut est GRATUIT ou ASSIGNÉ)
état du numéro id_set ----------------------- 1 000001 ATTRIBUÉ 1 000002 GRATUIT 1 000003 ATTRIBUÉ 1 000004 GRATUIT 1 000005 GRATUIT 1 000006 ATTRIBUÉ 1 000007 ATTRIBUÉ 1 000008 GRATUIT 1 000009 GRATUIT 1 000010 GRATUIT 1 000011 ATTRIBUÉ 1 000012 ATTRIBUÉ 1 000013 ATTRIBUÉ 1 000014 GRATUIT 1 000015 ATTRIBUÉ
et j'ai besoin de trouver "n" nombres consécutifs, donc pour n = 3, la requête retournerait
1 000008 GRATUIT 1 000009 GRATUIT 1 000010 GRATUIT
Il ne devrait renvoyer que le premier groupe possible de chaque id_set (en fait, il ne serait exécuté que pour id_set par requête)
Je vérifiais les fonctions de WINDOW, essayais quelques requêtes comme COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
, mais c'est tout ce que j'ai eu :) Je ne pouvais pas penser à la logique, comment faire cela dans Postgres.
Je pensais à créer une colonne virtuelle en utilisant les fonctions WINDOW comptant les lignes précédentes pour chaque nombre où status = 'FREE', puis sélectionnez le premier nombre, où count est égal à mon nombre "n".
Ou peut-être regrouper les numéros par statut, mais uniquement d'un ASSIGNÉ à un autre ASSIGNÉ et sélectionner uniquement les groupes contenant au moins "n" numéros
ÉDITER
J'ai trouvé cette requête (et l'ai un peu modifiée)
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
qui produit des groupes de numéros GRATUITS / ATTRIBUÉS, mais j'aimerais avoir tous les numéros du seul premier groupe qui remplit la condition