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 :

DISTINCT sur une seule colonne


Sujet :

Langage SQL

  1. #1
    Invité
    Invité(e)
    Par défaut DISTINCT sur une seule colonne
    Bonjour,

    Tout d'abord je tiens à indiquer que je sais parfaitement que DISTINCT ne peut être utilisé ici mais je ne trouvais pas de titre pour mon problème.

    Voici mon problème :

    J'ai une table comportant les colonnes suivantes : pseudo, point_id, date, note.
    Je souhaiterais obtenir la dernière personne étant passée par chaque point ainsi que la date de son passage et la note qu'il a laissée.

    Par exemple si ma table contient ces valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    pseudo	point_id	date			note
    toto	1		2011-04-03
    tata	1		2011-04-05
    titi	1		2011-04-01
    toto	2		2011-04-04
    toto	3		2011-04-02
    tata	3		2011-04-03
    je souhaiterais obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pseudo	point_id	date			note
    tata	1		2011-04-05
    toto	2		2011-04-04
    tata	3		2011-04-03
    Merci d'avance pour votre aide.
    Dernière modification par Waldar ; 06/06/2011 à 10h07. Motif: Résolu

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    bonjour voici une possibilité :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       SELECT Table1.Point_Id,
                   Table1.DATE,
                   Table1.Pseudo,
                   Table1.Note
              FROM (SELECT Table1.Point_Id,
                           MAX(Table1.DATE)
                      FROM Table1
                      GROUP BY Table1.Point_Id) AS Selection
                INNER JOIN Table1 ON (Selection.Point_Id = Table1.Point_Id AND Selection.DATE = Table1.DATE)

    note 1 : Il faut créer un index descendant sur la colonne "date"

    Note 2 : C'est une TRES mauvaise idée de donner un mot réservé à un nom de colonne
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour la réponse.

    J'ai également trouvé ceci en cherchant et j'aurais aimé savoir s'il y avait une solution meilleure que l'autre ou pas ?

    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
     
    SELECT
    	*
    FROM
    	Table1
    WHERE
    	Date =
    	(
    		SELECT
    			MAX(Date)
    		FROM
    			Table1 AS Selection
    		WHERE
    			Table1.Point_id = Selection.Point_id
    	)
    Pour la colonne date je m'en suis rendu compte au moment de faire cette requête mais j'ai déjà du code qui en dépend donc je modifierai tout à la fin si j'ai le temps. Je ne sais pas à quoi je pensais quand j'ai appelé cette colonne comme ça…

  4. #4
    Membre habitué Avatar de tfc3146
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Février 2009
    Messages : 79
    Points : 150
    Points
    150
    Par défaut
    Bonsoir,

    Geek87 votre requête est plus simple et plus performante (pas de GROUP BY), donc à utiliser.
    C'est en faisant n'importe quoi qu'on devient n'importe qui
    Si un message vous a aidé, n'hésitez pas à mettre +1

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses à tous les deux !

    Je marque résolu.

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Afin d'éviter plusieurs scannages de tables / index vous pourriez aussi utilisez une fonctions de fenêtrages :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    with tmp as (
    select pseudo, point_id, Date, note, dense_rank() over(partition by point_id order by Date desc) as rnk
    from Table1)
     
    select pseudo, point_id, Date, note
    from tmp
    where rnk = 1;

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    En effet, elle est plus rapide. Mais elle ne fournit pas les mêmes résultats
    Pour la sous requête, c'est ok.
    Mais avec la requête principale, elle renvoie toutes les infos pour les dates considérées (donc il peut avoir plusieurs lignes pour un même "Point_Id").

    Citation Envoyé par Geek87 Voir le message
    Merci pour la réponse.

    J'ai également trouvé ceci en cherchant et j'aurais aimé savoir s'il y avait une solution meilleure que l'autre ou pas ?

    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
     
    SELECT
    	*
    FROM
    	Table1
    WHERE
    	Date =
    	(
    		SELECT
    			MAX(Date)
    		FROM
    			Table1 AS Selection
    		WHERE
    			Table1.Point_id = Selection.Point_id
    	)
    Pour la colonne date je m'en suis rendu compte au moment de faire cette requête mais j'ai déjà du code qui en dépend donc je modifierai tout à la fin si j'ai le temps. Je ne sais pas à quoi je pensais quand j'ai appelé cette colonne comme ça…
    Merci d'ajouter un sur les tags qui vous ont aidé

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    En effet, elle est plus rapide. Mais elle ne fournit pas les mêmes résultats
    Pour la sous requête, c'est ok.
    Mais avec la requête principale, elle renvoie toutes les infos pour les dates considérées (donc il peut avoir plusieurs lignes pour un même "Point_Id").
    au vu de la jointure "Table1.Point_id = Selection.Point_id" je penses que sa requête est bonne, vu que la date max considérée pour une ligne ne le sera que pour le point_id en question.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Oui je viens de vérifier j'ai bien les mêmes résultats avec les deux requêtes. Je n'ai pas compris pourquoi cela ne devrait pas être le cas ?

  10. #10
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut


    mea culpa, c'est ma faute

    oui cela marche
    Merci d'ajouter un sur les tags qui vous ont aidé

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/04/2007, 17h32
  2. Afficher plusieur colonnes sur une seule colonne ?
    Par Interruption13h dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/02/2007, 16h57
  3. Figure sur une seule colonne
    Par Eusebius dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 1
    Dernier message: 08/07/2006, 23h46
  4. [Débutant] DISTINCT sur une seule des colonnes ?
    Par Neilos dans le forum Langage SQL
    Réponses: 9
    Dernier message: 23/06/2004, 23h04
  5. Recherche multi-mots sur une seule colonne
    Par Badiste dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2004, 11h24

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