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 :

Requête - group by ou pas ?


Sujet :

Langage SQL

  1. #1
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut Requête - group by ou pas ?
    Hello la communauté,

    N'écrivant des requêtes (non basique) que très rarement, je viens demander de l'aide car j'ai peur pour ses performances.

    Disons une table avec 100 000 Lignes, avec comme colonne :
    - ID (unique)
    - TYPE_P (le type, il existe 4 types parmi toutes les lignes)
    - DATE_E (date d'enregistrement de l'enregistrement)
    - TEXTE_E (une info)

    Ce que je veux ramener :

    - je veux ramener autant de ligne qu'il y a de types, donc 4
    - pour chaque type, remonter la ligne de la plus haute date

    J'aurai pu utiliser Group By sur le type et faire un MAX sur la date, mais Quid de TEXTE_E ? se sera au hasard ?

    Du coup, si je devais absolument trouver une solution, j'aurai fait :
    4 requêtes relié par des UNION, avec pour chacune d'elle un WHERE qui cible un seul TYPE_P (en dur donc), trié par date décroissant, LIMIT 1

    Mais j'ai peur des performances de cette requête... Il va passer 4 fois dans toute la table...


    Si quelqu'un peut m'orienter sur une solution plus propre, je suis preneur.
    Merci
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  2. #2
    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,

    Quel est votre sgbd ?

  3. #3
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Ah oui pardon : SQL Server 2008 R2
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  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 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Utilisez une fonction de fenetrage

  5. #5
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Bonjour,

    Merci de l'info, je n'avais encore jamais entendu.

    Je vais étudier ça.
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  6. #6
    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 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Comme ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH XXCTE AS                                                 
       (SELECT  ROW_NUMBER()                                       
                OVER (PARTITION BY TYPE_P ORDER BY DATE_E) AS RANG 
               ,ID, TYPE_P, DATE_E, TEXTE_E                     
         FROM MA_TABLE)                                                 
    SELECT ID, TYPE_P, DATE_E, TEXTE_E                         
    FROM XXCTE                                                    
    WHERE RANG = 1

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Août 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 19
    Points : 115
    Points
    115
    Par défaut
    Si la date est unique pour un type donné, tu peux faire une requête de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
       t.ID, t.TYPE_P, t.DATE_E, t.TEXTE_E
    FROM
       MA_TABLE t
    INNER JOIN
     (SELECT TYPE_P,MAX(DATE_E) as DATE_E FROM MA_TABLE GROUP BY TYPE_P) f on f.TYPE_P=t.TYPE_P and f.DATE_E=t.DATE_E
    Mais, en fonction du ratio update/lecture sur cette table, il y a d'autre technique de dénormalisation pour optimiser cette requête très gourmande

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Comme ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH XXCTE AS                                                 
       (SELECT  ROW_NUMBER()                                       
                OVER (PARTITION BY TYPE_P ORDER BY DATE_E) AS RANG 
               ,ID, TYPE_P, DATE_E, TEXTE_E                     
         FROM MA_TABLE)                                                 
    SELECT ID, TYPE_P, DATE_E, TEXTE_E                         
    FROM XXCTE                                                    
    WHERE RANG = 1
    Je te corrige....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH XXCTE AS                                                 
       (SELECT  ROW_NUMBER()                                       
                OVER (PARTITION BY TYPE_P ORDER BY DATE_E DESC) AS RANG 
               ,ID, TYPE_P, DATE_E, TEXTE_E                     
         FROM MA_TABLE)                                                 
    SELECT ID, TYPE_P, DATE_E, TEXTE_E                         
    FROM XXCTE                                                    
    WHERE RANG = 1
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Merci à tous !

    C'est répond exactement à mon besoin, je ne connaissais pas du tout.


    Petite question subsidiaire :

    J'avais bien sur simplifié le problème pour l'énoncer, j'ai évidemment des petites jointures à faire pour faire apparaître les données qui vont bien,

    Je me dis qu'il vaut mieux faire ces petites jointures sur le résultat (le deuxième SELECT), et non pas dans la requête de fenêtrage, n'est ce pas ?

    Ou ça change rien ?
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  10. #10
    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 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    La CTE crée dans votre cas une table de 4 lignes, donc d'un point de vue performances c'est une circonstance favorable

    Après reste à voir vos critères de jointure, sargable ou non, et le volume des tables à joindre

  11. #11
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Parmi les tables à joindre il y a la table principal de la base de données... Donc plutôt imposante
    Donc j'ai mis les jointures à la fin.
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

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

Discussions similaires

  1. [php-mysql] requête qui ne marche pas....
    Par sanosuke85 dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/01/2006, 17h18
  2. Une requête qui ne reconnait pas is not null
    Par LeBauw dans le forum Access
    Réponses: 2
    Dernier message: 08/09/2005, 12h29
  3. Requête qui ne passe pas
    Par TheBart dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/08/2005, 10h12
  4. Aide sur une requête (Group By...??)
    Par Cocolapin dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/12/2004, 10h26
  5. requête update qui marche pas
    Par MrsFrizz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/12/2004, 08h16

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