0
votes

Comment obtenir un numéro de lot consécutif basé sur une gamme?

J'ai une table comme ceci: xxx

Comment ma requête SQL devrait-elle regarder le numéro de lot consécutif basé sur une plage (première correspondance).

E.g. Retour 3 à portée (95090, 95089, 95088) Retour 5 à portée (95086, 95085, 95084, 95083, 95082)


0 commentaires

3 Réponses :


0
votes

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;


0 commentaires

1
votes

Il s'agit d'une variation complexe du problème des lacunes et de l'île, depuis:

  • Vous voulez tous les elements d'un groupe (non seulement le début et la fin) li>
  • Vous ne voulez que les éléments du premier groupe qui répond à la condition li> ul>

    La requête suivante fait ce que vous attendez: p> xxx pré>

    clause où cnt> = 3 code> peut être utilisé pour contrôler la cible Longueur des nombres consécutifs. P>

    Démo sur DB Fiddle strong> p> xxx pré>


    É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 ID code>. Voici le jeu de données: P>

    select lotNumber
    from (
        ... above query ...
    ) t
    where rn = 1
    
    | lotnumber |
    | --------- |
    | 95090     |
    | 95089     |
    | 95088     |
    


1 commentaires

J'aurais peut-être surchargé cela et je suis prêt à voir si quelqu'un propose une solution plus simple!



1
votes

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;


3 commentaires

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 , mais semble pas avec n = 6 : 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".