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 :

Double group by ?


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut Double group by ?
    Bonjour,
    je ne vois pas trop comment expliquer ma problématique, du coup je vais vous donner un exemple.

    J'utilise une base de données PostgreSql que je ne peux pas modifier.

    Soit une table avec les infos suivantes :
    N° client Type de dossier N° de dossier ...
    1000 Perfusion 1 ...
    1000 Perfusion 40 ...
    1000 Perfusion 130 ...
    1000 Nutrition 90 ...
    1000 Nutrition 10 ...
    1005 Nutrition 52 ...
    1005 Nutrition 68 ...

    Je souhaiterais ne conserver que le dernier dossier de chaque type de chaque patient :
    N° client Type de dossier N° de dossier ...
    1000 Perfusion 130 ...
    1000 Nutrition 90 ...
    1005 Nutrition 68 ...

    En sachant que le numéro de dossier est unique.

    La seule façon que j'ai trouvée qui me parait ultra lourde et galère :
    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
    SELECT *
    FROM table
    WHERE N° de dossier IN
    (
        SELECT MAX(N° de dossier)
        FROM table
        WHERE Type de dossier = 'PERFUSION'
        GROUP BY N° de client
     
        UNION
     
        SELECT MAX(N° de dossier)
        FROM table
        WHERE Type de dossier = 'NUTRITION'
        GROUP BY N° de client
    )
    Car là, dans l'exemple, il n'y a que 2 types de dossiers mais dans ma base, il y en a beaucoup...

    Auriez-vous une autre idée pour arriver au résultat voulu plus simplement et si possible, plus rapidement ?

    Merci.
    Sous Kubuntu 20.04

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Je doute que ta requete fonctionne, syntaxiquement cela me semble douteux.
    Est-ce qu'une requete comme celle ci, correspond à ton besoin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT *
    FROM table T
    inner join (
        SELECT "N° de client", "Type de dossier",MAX("N° de dossier") MAX_Num_Dossier
        FROM table
     
        GROUP BY "N° de client", "Type de dossier"
     
    ) M
    on T."N° de dossier"=MAX_Num_Dossier
    A+
    Soazig

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 228
    Points : 12 839
    Points
    12 839
    Par défaut
    Bonjour,
    Je ne comprends pas trop le problème.
    Puisqu'il faut le dernier dossier par type et par client, un seul group by doit suffire !
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select NoClient,TypeDossier,max(Nodossier)
    From LaTable
    group by NoClient,TypeDossier
    Bien sûr en prenant l'hypothèse que le numéro de dossier s'incrémente au fil du temps. Sinon il faut horodater les lignes.

    Tatayo.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    En effet, ma question n'est pas celle que j'avais vraiment en tête.

    Mais il s’avère que nos 3 solutions sont kif kif et me donne les mêmes résultats si je teste sur 2/3 types.

    A la base je cherchais une solution sans sous requête ou jointure...

    Merci à vous et désolé pour la perte de temps
    Sous Kubuntu 20.04

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Vous pouvez aussi faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select t.*
      from (select matable.*
                 , row_number() over(partition by "N° de client", "Type de dossier" order by "N° de dossier" desc) as rn
              from matable) as t
     where t.rn = 1;

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Avec les 1ere solution : 20-25s.

    Avec ta solution, j'ai arrêté la requête au bout de 2min.

    mais merci de ta proposition
    Sous Kubuntu 20.04

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

Discussions similaires

  1. Double jointure avec double group by
    Par annebe dans le forum DB2
    Réponses: 0
    Dernier message: 28/01/2013, 14h52
  2. DOUBLE GROUP BY
    Par bernardcyril dans le forum Requêtes
    Réponses: 0
    Dernier message: 04/09/2012, 19h34
  3. Double GROUP BY ?
    Par Jean Fi dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/10/2010, 22h25
  4. "double" group by
    Par yanice dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/06/2010, 15h02
  5. [VB] Possibilité de créer un double groupe de contrôles ?
    Par Laialexela dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/12/2005, 09h03

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