IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Sélection et comptage d'une plage de numéros consécutifs


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Par défaut Sélection et comptage d'une plage de numéros consécutifs
    Bonjour,

    Après plusieurs heures de prises de tête sur les fonctions analytiques, je vous présente mon problème.

    Je cherche à sélectionner plusieurs plages de numéros consécutifs et à les compter. Pour compliquer les choses, les numéros ont un propriétaire et un statut.
    Un exemple sera plus parlant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    NUMERO          STATUT           ID_PROPRIO
    ----------------------------------------------
    1424               D                   1
    1425               I                    1
    1426               D                   1
    1427               D                   2
    1428               D                   2
    2500               D                   1
    2501               D                   1
    2502               D                   1
    2504               I                   1
    Et voilà le résultat que j'essaie d'obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    NUM_DEBUT       NUM_FIN       NOMBRE_D         ID_PROPRIO
    -------------------------------------------------------------
    1424               1426           2                  1
    1427               1428           2                  2
    2500               2502           3                  1
    2504               2504           0                  1
    Avec NUM_DEBUT = premier numéro de la série
    NUM_FIN = le dernier numéro de la série
    NOMBRE_D = le nombre de numéro en statut D

    Merci

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Dans votre exemple que est-ce qu’il fait qu’on a 3 dans la colonne id_proprio pour la plage des valeurs 2500-2502 ?

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Je pense que 3 est un bug de présentation, regarde first/last :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    SQL> with t as (
      2  select 1424 as NUMERO, 'D' as STATUT, 1 as ID_PROPRIO from dual union all
      3  select 1425 as NUMERO, 'I' as STATUT, 1 as ID_PROPRIO from dual union all
      4  select 1426 as NUMERO, 'D' as STATUT, 1 as ID_PROPRIO from dual union all
      5  select 1427 as NUMERO, 'D' as STATUT, 2 as ID_PROPRIO from dual union all
      6  select 1428 as NUMERO, 'D' as STATUT, 2 as ID_PROPRIO from dual union all
      7  select 2500 as NUMERO, 'D' as STATUT, 1 as ID_PROPRIO from dual union all
      8  select 2501 as NUMERO, 'D' as STATUT, 1 as ID_PROPRIO from dual union all
      9  select 2502 as NUMERO, 'D' as STATUT, 1 as ID_PROPRIO from dual union all
     10  select 2504 as NUMERO, 'I' as STATUT, 1 as ID_PROPRIO from dual
     11  ),
     12         regroup_t as (
     13  select numero, statut, id_proprio,
     14         numero - row_number() over(partition by id_proprio order by numero) as grp
     15    from t
     16  )
     17  select min(numero) keep (dense_rank first order by numero) as num_debut,
     18         max(numero) keep (dense_rank first order by numero desc) as num_fin,
     19         sum(case when statut = 'D' then 1 else 0 end) as nombre_d,
     20         id_proprio
     21    from regroup_t
     22   group by grp, id_proprio;
     
     NUM_DEBUT    NUM_FIN   NOMBRE_D ID_PROPRIO
    ---------- ---------- ---------- ----------
          1424       1426          2          1
          1427       1428          2          2
          2500       2502          3          1
          2504       2504          0          1
     
    SQL>

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Pas besoin de FIRST / LAST ici, dans la dernière partie de la requête, MIN / MAX sont suffisants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT min(numero)                            AS num_debut
           , max(numero)                            AS num_fin
           , count(case statut when 'D' then 1 end) AS nombre_d
           , id_proprio
        FROM regroup_t
    GROUP BY grp, id_proprio
    ORDER BY min(numero) asc;

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Pas besoin de FIRST / LAST ici
    C'est vrai merci d'avoir corrigé.

  6. #6
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Dans votre exemple que est-ce qu’il fait qu’on a 3 dans la colonne id_proprio pour la plage des valeurs 2500-2502 ?
    C'est effectivement une erreur de présentation Il faut lire 1.
    Merci pour vos réponses, je teste ça et je reviens vers vous !

  7. #7
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Par défaut
    Rapide et efficace !!

    Merci bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sélection et copie d'une plage variable
    Par Rémy A. dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/07/2013, 18h44
  2. Userform pour sélection d'une plage de cellule
    Par humbp dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/01/2008, 12h41
  3. récupérer le numéro de ligne d'une plage en fonc
    Par triaguae dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/12/2007, 13h33
  4. Réponses: 1
    Dernier message: 09/03/2007, 07h52
  5. Sélection d'une plage de dates
    Par Bouanda dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/10/2004, 20h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo