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

Requêtes PostgreSQL Discussion :

Requête dans une même table


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut Requête dans une même table
    Bonjour,

    J'ai par exemple un table comme ceci:

    code libelle date_debut date_fin
    aaaa libelle de aaaa 20080101 20081231
    bbbb Libelle de bbbb 20080101 20081231
    bbbb Libelle de bbbb modifié 20090101 20091231

    Je voudrai comme résultat ceci:

    code libelle date_debut date_fin
    aaaa libelle de aaaa 20080101 20081231
    bbbb Libelle de bbbb modifié 20080101 20091231

    Quelle serait la requette à faire?

    Cordialement,
    Vandman

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 135
    Par défaut
    Peux-tu expliquer clairement pourquoi tu retiens une ligne plutôt qu'une autre ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut
    Bonjour,

    Chaque annee:
    Le code est soit prolongé pour une nouvelle année soit stopper.
    Le code peut d'une année à l'autre changer de libellé.

    J'ai besoin dans mon logiciel de connaitre depuis quand est valide le code et jusqu' a quand et d'avoir le dernier libellé.

    Cordialement,

    Vandman

  4. #4
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut
    Bonjour,

    Je pense que j'ai trouvé:

    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
    WITH ListeMinMax AS
    (
    SELECT	code
    	,MIN(date_debut) AS DateFROM
    	,MAX(date_fin) AS DateTO
    FROM Schema.table
    GROUP BY code
    )
    SELECT DISTINCT ON (CODE)
    	LMM.code
    	,table.libelle
    	,LMM.DateFROM
    	,LMM.DateTO
    FROM Schema.table
    	RIGHT JOIN ListeMinMax AS LMM
    		ON table.date_fin = LMM.DateTO AND table.code = LMM.code
    Cela présupose que la date de fin est unique.
    Cette requette permet d'avoir le dernier libelle en vigueur et les dates de validité du code.

    Cordialement,
    Vandman

  5. #5
    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
    C'est correct, sans vraiment l'être.
    Vous pouvez remplacer votre jointure externe par une jointure forte.

    Établir la jointure sur le code et la date de fin entraîne que vous n'avez pas besoin d'utiliser la spécificité DISTINCT ON, la requête suivante convient :
    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
    with cte_listeminmax as
    (
      select code
           , min(date_debut) as datefrom
           , max(date_fin)   as dateto
        from matable
    group by code
    )
    select lmm.code
         , tbl.libelle
         , lmm.datefrom
         , lmm.dateto
      from matable         as tbl
      join cte_listeminmax as lmm
        on tbl.date_fin = lmm.dateto
       and tbl.code     = lmm.code;
    Si vous voulez utiliser DISTINCT ON, la jointure sur le code est suffisante.
    Il faut bien gérer le tri dans ce cas, sinon vous allez au devant de mauvaises surprises :
    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
    with cte_listeminmax as
    (
      select code
           , min(date_debut) as datefrom
           , max(date_fin)   as dateto
        from matable
    group by code
    )
      select distinct on (lmm.code)
             lmm.code
           , tbl.libelle
           , lmm.datefrom
           , lmm.dateto
        from matable         as tbl
        join cte_listeminmax as lmm
          on tbl.code = lmm.code
    order by lmm.code        asc
           , tbl.date_debut desc;
    Gardez à l'esprit que DISTINCT ON est une syntaxe propriétaire à PostgreSQL qui ne fait pas partie de la norme SQL.

  6. #6
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut
    Bonjour,

    J'utilisais le DISTINCT ON car j'ai d'autre colonne dont je n'ai pas parlé qui font que j'ai des doublons sur mon résultat.

    Vaut-il mieux Faire un GROUP BY?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY lmm.code, tbl.libelle, lmm.datefrom, lmm.dateto
    Cordialement,
    Vandman

Discussions similaires

  1. Copier un enregistrement dans une même table
    Par slammer dans le forum Langage SQL
    Réponses: 11
    Dernier message: 04/05/2010, 23h17
  2. Réponses: 3
    Dernier message: 18/02/2010, 23h00
  3. Requête imbriquée dans une même table
    Par casavba dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/01/2008, 21h02
  4. [Requête] plusieurs champs dans une même table ayants la même source
    Par Christophe93250 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 25/04/2006, 16h18
  5. [SQL] Somme de 2 colonnes dans une même table
    Par Cyrilange dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/04/2005, 08h32

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