J'ai une table comme ceci: Comment ma requête SQL devrait-elle regarder le numéro de lot consécutif basé sur une plage (première correspondance). P> E.g. Retour 3 à portée (95090, 95089, 95088)
Retour 5 à portée (95086, 95085, 95084, 95083, 95082) P> P>
3 Réponses :
Utilisez Row_Number pour commander par
Select LotNumber, row_number() over (partition by Substr(3,length(LotNumber),lotnumber) order by LotNumber ) rn from table order by rn;
Il s'agit d'une variation complexe du problème des lacunes et de l'île, depuis:
La requête suivante fait ce que vous attendez: p> clause Étape par étape explications forte> p> Pour commencer, cela peut Seulement être résolu si em> une colonne existe qui peut être utilisé pour commander les enregistrements (dans les tableaux SQL, les enregistrements sont par défaut non ordonné). Je suppose qu'une telle colonne existe et s'appelle où cnt> = 3 code> peut être utilisé pour contrôler la cible Longueur des nombres consécutifs. P>
ID code>. Voici le jeu de données: P>
select lotNumber
from (
... above query ...
) t
where rn = 1
| lotnumber |
| --------- |
| 95090 |
| 95089 |
| 95088 |
J'aurais peut-être surchargé cela et je suis prêt à voir si quelqu'un propose une solution plus simple!
Si vous avez une valeur n code>, vous pouvez utiliser
lead () code> pour cela. Pour obtenir le premier dans la série:
select t.*
from (select t.*,
lead(lotnumber, <n> - 1) over (order by lotnumber) as n_after
from t
) t
where n_after - lotnumber = <n> - 1;
Solution parfaite Gordon Même si je me demandais pouvait être beaucoup plus simple avec le plomb () ou le décalage () pour vérifier si la valeur est consécutive ou non
Avec l'exemple de données d'OP, cela fonctionne avec n = 3 code>, mais semble pas avec
n = 6 code>: voir Ce Fiddle
@Gmb. . . Il y avait (au moins ce que je considère comme) une faute de frappe dans la réponse. Il donne des résultats très raisonnables, quelle que soit la valeur de "n".