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

Langage SQL Discussion :

Première occurence de chaque groupe de données dans une table


Sujet :

Langage SQL

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2020
    Messages : 2
    Par défaut Première occurence de chaque groupe de données dans une table
    Bonjour à tous,

    Je suis en train de construire une requête qui sélectionne un ID "partiel" dans une table et qui doit récupérer dans une autre table la première occurrence active (j'entends par active, dont la date de fin de validité n'est pas dépassée) dont l'ID "complet" commence par l'ID partiel de l'autre table.

    Exemple :

    Table 1 :
    MATRICULE DATE ID_PARTIEL
    000001 31/07/2020 ABCDDD
    000002 31/07/2020 ABCEEE
    000002 31/07/2020 ABCDEF

    Table 2 :

    ID_PARTIEL ID_COMPLET DATE_FIN_VALIDITE
    ABCDDD ABCDDD01 30/04/2020
    ABCDDD ABCDDD02 31/12/2020
    ABCDDD ABCDDD03 31/12/2020
    ABCEEE ABCEEE01 31/12/2020
    ABCEEE ABCEEE02 31/12/2020
    ABCEEE ABCEEE03 31/12/2020
    ABCDEF ABCDEF01 31/12/2020
    ABCDEF ABCDEF02 31/12/2020
    ABCDEF ABCDEF03 31/12/2020

    Le résultat que je souhaite obtenir pour ma requête est le suivant :

    MATRICULE DATE ID_PARTIEL ID_COMPLET
    000001 31/07/2020 ABCDDD ABCDDD02
    000002 31/07/2020 ABCEEE ABCEEE01
    000002 31/07/2020 ABCDEF ABCDEF01

    J'ai essayé avec "TOP 1" mais cela me donne uniquement la première occurrence de la table entière (sans tenir compte du regroupement par ID_complet).

    Voici l'un exemple des essais que j'ai fait :

    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
    WITH
    	T1 as
    		(select
    			MATRICULE,
    			DATE,
    			ID_PARTIEL
    		 from
    			TABLE1),
    	T2 as
    		(select
    			ID_PARTIEL, 
    			ID_COMPLET, 
    			DATE_FIN_VALIDITE
    		 from 
    			TABLE2)
    
    SELECT TOP 1
    	T1.MATRICULE,
    	T1.DATE,
    	T1.ID_PARTIEL,
    	T2.ID_COMPLET
    FROM
            T1 inner join T2
                 on T1.ID_PARTIEL = T2.ID_PARTIEL
                 and T1.DATE < T2.DATE_FIN_VALIDITE
    Si je mets le TOP 1 je n'ai qu'une seule ligne et si je ne le mets pas j'ai les occurrences de la Table 1 et de la table 2...

    Auriez-vous une idée pour répondre à mon besoin ?

    Merci d'avance d'avoir pris le temps de me lire.

    Cordialement,
    zz

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 167
    Par défaut
    Bonjour,

    Tu peux utiliser la fonction analytique row_number :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with t as (select T1.MATRICULE, T1.DATE, T1.ID_PARTIEL, T2.ID_COMPLET, row_number() over (partition by t1.id_partiel order by t2.id_complet) rn
          from t1
          join t2 on t1.id_partiel = t2.id_partiel and t2.date_fin_validite > t1.date
         )
    select matricule, date, id_partiel, id_complet
    from t
    where rn = 1;
     
    MATRICU DATE                 ID_PAR ID_COMPL
    ------- ------------------- ------ --------
    000001  31/07/2020 00:00:00 ABCDDD ABCDDD02
    000002  31/07/2020 00:00:00 ABCDEF ABCDEF01
    000002  31/07/2020 00:00:00 ABCEEE ABCEEE01

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2020
    Messages : 32
    Par défaut
    Reste à définir ce que veux dire

    récupérer dans une autre table la première occurrence active
    Dans l'exemple de vanagreg cela va récupérer le premier id_complet classé par ordre alphabétique, à toi d'adapter selon ton besoin.

  4. #4
    Nouveau candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2020
    Messages : 2
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    Tu peux utiliser la fonction analytique row_number :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with t as (select T1.MATRICULE, T1.DATE, T1.ID_PARTIEL, T2.ID_COMPLET, row_number() over (partition by t1.id_partiel order by t2.id_complet) rn
          from t1
          join t2 on t1.id_partiel = t2.id_partiel and t2.date_fin_validite > t1.date
         )
    select matricule, date, id_partiel, id_complet
    from t
    where rn = 1;
     
    MATRICU DATE                 ID_PAR ID_COMPL
    ------- ------------------- ------ --------
    000001  31/07/2020 00:00:00 ABCDDD ABCDDD02
    000002  31/07/2020 00:00:00 ABCDEF ABCDEF01
    000002  31/07/2020 00:00:00 ABCEEE ABCEEE01
    Bonne idée ! je n'y avais pas pensé... Je te remercie, je devrais m'en sortir avec ça !

    Merci beaucoup

Discussions similaires

  1. Ajouter ligne sup pour chaque groupe de doublon dans une liste
    Par Yashin dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/07/2009, 12h42
  2. Réponses: 3
    Dernier message: 07/02/2006, 13h26
  3. [MySQL] Modifier une donnée dans une table
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 27
    Dernier message: 02/02/2006, 13h25
  4. Inserer des données dans une table access SQL
    Par ouellet5 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 23/11/2005, 21h11
  5. Réponses: 2
    Dernier message: 15/06/2005, 17h32

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