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 :

Compter le nombre des doublons dans une table et la date du dernier doublon


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 92
    Points : 61
    Points
    61
    Par défaut Compter le nombre des doublons dans une table et la date du dernier doublon
    Bonjour,

    Je possède deux tables : une table client et une table Achat. La table achat contient les achats effectués par le client.

    La table client contient :

    id_client nom ville age
    1 Marie Paris 28
    2 Simon Marseille 45
    3 Paul Lyon 63
    4 Léon Paris 19
    5 Pierre Nantes 36
    6 Bernard Nice 74
    7 Julie Annecy 18
    8 Candice Lyon 24
    9 Valentin Dijon 19
    10 Ambre Grenoble 19

    La table achat contient :

    id_achat id_client nom_client date_achat type_achat
    1 5 Pierre 2023-02-16 13:17:52.386878 En_ligne
    2 2 Simon 2020-12-15 16:17:52.282147 En_ligne
    3 1 Marie 2022-10-19 13:17:52.798179 En_ligne
    4 1 Marie 2022-10-19 13:17:53.292464 En_ligne
    5 1 Marie 2022-10-19 13:17:53.586098 En_ligne
    6 5 Pierre 2023-02-16 13:17:52.386878 En_ligne
    7 4 Léon 2022-08-10 14:34:52.392697 En_ligne
    8 4 Léon 2022-08-10 14:34:02.635146 En_ligne
    9 4 Léon 2022-08-10 14:34:15.155794 En_ligne
    10 4 Léon 2022-08-10 18:11:15.155794 En_ligne
    11 3 Paul 2023-12-19 10:02:22.449046 En_ligne
    12 6 Bernard 2024-01-08 13:49:25.996171 En_ligne
    13 8 Candice 2023-07-04 12:07:53.239075 En_boutique
    14 7 Julie 2023-07-24 13:17:52.386878 En_boutique
    15 10 Sarah 2023-11-17 14:40:10.644737 En_boutique


    Je cherche deux requêtes :
    - la première requête me compte le nombre de doublons(type_achat = en_ligne) dans la table des achats ==> Ici le resultat doit me renvoyer 3 (3 doublons : Pierre, Marie et Léon)
    - la deuxième requête me renvoie la date du dernier doublon : 2022-10-19 13:17:53.586098

    Malheureusement pour ma première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT   COUNT(*) AS nbr_doublon, id_client
    FROM     table
    GROUP BY id_client
    HAVING   COUNT(*) > 1
    ne me donne pas le bon résultat
    et je ne vois pas comment récupérer la dernière date pour le dernier doublon

    Auriez-vous une idée ?

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 217
    Points
    8 217
    Billets dans le blog
    17
    Par défaut
    - la première requête me compte le nombre de doublons(type_achat = en_ligne) dans la table des achats ==> Ici le resultat doit me renvoyer 3 (3 doublons : Pierre, Marie et Léon)
    with dataset as (
        -- Récupère les clients apparaissant plusieurs fois
        select all id_client
        from achat
        where type_achat = 'En_ligne'
        group by id_client
        having count(*) > 1
    )
    select all count(*) as nombre_doublons -- Compte le nombre de clients uniques apparus plusieurs fois
    from dataset;
    - la deuxième requête me renvoie la date du dernier doublon : 2022-10-19 13:17:53.586098
    with dataset as (
        select all max(date_achat) as dernier_achat
        from achat
        where type_achat = 'En_ligne'
        group by id_client
        having count(*) > 1
    )
    select all max(dernier_achat) as tout_dernier_achat
    from dataset;
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 92
    Points : 61
    Points
    61
    Par défaut
    Bonjour @Séb

    Je n'ai pas compris ta requête, peux tu expliquer clairement
    Moi j'execute cette requête sur postgresql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    with dataset as (
        -- Récupère les clients apparaissant plusieurs fois
        select all id_client -- select all id_client, ne faut il pas faire select count(*), id_client, le mot clé all passe dans postgresql
        from achat
        where type_achat = 'En_ligne'
        group by id_client
        having count(*) > 1
    )
    select all count(*) as nombre_doublons -- Compte le nombre de clients uniques apparus plusieurs fois
    from dataset;

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    @Séb. : il manque la colonne id_client pour pouvoir identifier quels sont les clients qui ont fait plusieurs achats en ligne.

    @lnquaidorsay :
    • stocker l'âge du client dans une table est une aberration. L'âge change tous les jours, il faut donc stocker la date de naissance et calculer l'âge par requête quand on en a besoin.
    • vous trouverez dans mon blog les différentes méthodes permettant d'identifier la ligne correspondant au critère plus récent/plus ancien/plus petit/plus grand

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 217
    Points
    8 217
    Billets dans le blog
    17
    Par défaut
    @Séb. : il manque la colonne id_client pour pouvoir identifier quels sont les clients qui ont fait plusieurs achats en ligne.
    Il n'y avait pas de demande en ce sens, seulement un besoin en décompte.

    Je n'ai pas compris ta requête, peux tu expliquer clairement
    Pas sans savoir si le résultat convient
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par lnquaidorsay Voir le message
    Malheureusement pour ma première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT   COUNT(*) AS nbr_doublon, id_client
    FROM     table
    GROUP BY id_client
    HAVING   COUNT(*) > 1
    ne me donne pas le bon résultat
    Est-ce que ceci...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select nom_client, count(nom_client) 
    from achat 
    group by nom_client
    having count(nom_client) > 1;
    pourrait aller ???

    Et si cela convient, alors une requête imbriquée pour les compter...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select count(distinct nom_client) from achat
    where nom_client in (
    	select nom_client
    	from achat 
    	group by nom_client
    	having count(nom_client) > 1
    );

    Citation Envoyé par lnquaidorsay Voir le message
    - la deuxième requête me renvoie la date du dernier doublon : 2022-10-19 13:17:53.586098
    Il faut donc d'abord trouver les clients en doublon...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select nom_client, count(nom_client) 
    from achat 
    group by nom_client
    having count(nom_client) > 1;

    Ensuite trouver les dates de ces clients, trier les dates et ne prendre que la première...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select nom_client, date_achat
    from achat
    where client in (
    	select nom_client
    	from achat 
    	group by nom_client
    	having count(nom_client) > 1
    ) order by date_achat desc limit 1;
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    bonjour

    Citation Envoyé par Sve@r Voir le message
    Est-ce que ceci...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select nom_client, count(nom_client) 
    from achat 
    group by nom_client
    having count(nom_client) > 1;
    pourrait aller ???
    Vérifier l'unicité en se basant sur une colonne de type libellé est la meilleure façon de se prendre les pieds dans le tapis.
    S'il y a des identifiants techniques dans les tables, c'est bien parce qu'un libellé tel qu'un nom, un prénom, une enseigne, une raison sociale, etc. ne sont jamais uniques, même en les combinant .
    Si les clients sont des entreprises, cette requête va considérer que tous les "hotels bellevue" et tous les "cafés des sports" sont des doublons..., et pour les particuliers, ce sera encore pire : un seul "Martin" et un seul "Dupond" dans une base clients, ce n'est pas très réaliste

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Vérifier l'unicité en se basant sur une colonne de type libellé est la meilleure façon de se prendre les pieds dans le tapis.
    Ah pardon j'avais mal lu la table (pas vu les identifiant clients). D'ailleurs j'avais pas vu non plus qu'il ne désirait que les doublons des achats "En_ligne". Bref j'ai rien vu quoi

    Ceci dit, l'idée reste bonne...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select id_client, count(id_client) 
    from achat 
    where "Type_Achat" = 'En_ligne'
    group by id_client
    having count(id_client) > 1;
    ... et les autres requêtes seront reprises dans le même esprit.

    Accessoirement cette table n'est pas en 3° forme normale (les noms des clients ne doivent pas y apparaître)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Oui mais compter les id clients était déjà dans le 1er post...
    .. quant aux formes normales, on en est très loin, mais pas à cause du nom du client qui est cohérent avec l'identifiant client, mais à cause de la ville, qui elle, n'a rien à faire ici.
    On devrait trouver l'identifiant de la ville comme FK pointant vers une table des villes.
    Et également, comme déjà mentionné, non pas un âge, mais une date de naissance.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Oui mais compter les id clients était déjà dans le 1er post...
    A ceci près que la première requête ne mentionne pas le type d'achat ciblé (c'est peut-être pour cela qu'elle ne retourne pas le bon résultat)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Compter le nombre d'enregistrements dans une table
    Par youhibadelphi dans le forum Langage SQL
    Réponses: 5
    Dernier message: 24/06/2009, 20h30
  2. Compter le nombre de vide dans une table / variable
    Par diombo dans le forum VBA Access
    Réponses: 4
    Dernier message: 13/05/2009, 00h32
  3. Compter le nombre d'enregistrement dans une table selon un critere
    Par Angelo91 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 18/08/2008, 12h05
  4. [SQL] Compter le nombre d'occurences dans une table par valeur
    Par SpaceFrog dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/04/2008, 17h22
  5. Compter le nombre de colonne dans une table
    Par Coin dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/12/2006, 16h03

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