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 :

Problème avec GROUP BY (cas spécial)


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut Problème avec GROUP BY (cas spécial)
    Bonjour,
    j'ai actuellement une application codée avec SQLite, mais je suis en train de passer à PostgreSQL, parce que SQLite commence à devenir insuffisant pour les besoins du projet.

    Voici donc l'extrait hyper simplifié de la requête sur la quelle je travaille:

    Imaginez la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TABLE essais (content TEXT NOT NULL, ordre INTEGER NOT NULL, gr TEXT NOT NULL)
    avec les valeurs suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'a'     -     '1'     -     'e1'
    'd'     -     '4'     -     'e1'
    'b'     -     '2'     -     'e1'
    'c'     -     '3'     -     'e1'
    'a'     -     '1'     -     'e2'
    'd'     -     '4'     -     'e2'
    'b'     -     '2'     -     'e2'
    'c'     -     '3'     -     'e2'
    Maintenant la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tmp.content, tmp.ordre FROM (SELECT * FROM essais
    ORDER BY ordre ASC) AS tmp
    GROUP BY tmp.gr
    Je sais, c'est pas correct ! Et je comprends très bien pourquoi, seulement avec SQLite ça me donnerait cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'd', 4, 'e1'
    'd', 4, 'e2'
    En fait, mon but est de récupérer la dernière ligne pour chaque "groupe", et le ORDER BY est là pour trier les lignes comme il faut, à savoir que SQLite prend la dernière ligne pour chaque groupe lors d'un GROUP BY, ce qui n'est pas le cas de PostgreSQL (normal).

    Mais voilà, je ne vois pas comment faire ça en PostgreSQL ...
    Vous avez une idée ?

    Merci d'avance.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 16
    Points : 28
    Points
    28
    Par défaut
    Tu peux essayer cet ordre sql si tu es sur du postgresql 9, ca peut fonctionner aussi avec du 8.4 me semble

    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
      tmp.content,
      tmp.ordre
    FROM
      (
        SELECT
          tmp.content,
          tmp.ordre,
          row_number() over( partition BY tmp.content ORDER BY tmp.ordre DESC) AS rn
        FROM
          essais
      )
      t
    WHERE
      rn = 1

  3. #3
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    Je suppose que tu veux dire ça :

    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
      tmp.content,
      tmp.ordre,
      tmp.gr
    FROM
      (
        SELECT
          essais.content,
          essais.ordre,
          essais.gr,
          row_number() over( partition BY essais.content ORDER BY essais.ordre DESC) AS rn
        FROM
          essais
      ) AS  tmp
    WHERE
      rn = 1
    non, ça marche pas, ça donne tout les résultats du groupe "c1" triés par ordre ...

    au fait, j'ai rajouté une colonne id en auto_increment, si ça peu aider ...

    j'ai entendu parler des fonctions de fenêtrage, mais je n'ai trouvé aucun tutos sur ça ...

    Merci encore.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par Dominique49 Voir le message
    Maintenant la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tmp.content, tmp.ordre FROM (SELECT * FROM essais
    ORDER BY ordre ASC) AS tmp
    GROUP BY tmp.gr
    Je sais, c'est pas correct ! Et je comprends très bien pourquoi, seulement avec SQLite ça me donnerait cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'd', 4, 'e1'
    'd', 4, 'e1'
    Ca voudrait dire qu'un SELECT de 2 colonnes avec SQLite peut sortir 3 colonnes parce qu'il y a un GROUP BY? Sérieusement?
    Ca parait douteux tant c'est éloigné du SQL standard.

  5. #5
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    Désolé, je me suis trompé un peu, je voulais dire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tmp.content, tmp.ordre, tmp.gr FROM (SELECT * FROM essais
    ORDER BY ordre ASC) AS tmp
    GROUP BY tmp.gr
    Je sais, c'est pas correct ! Et je comprends très bien pourquoi, seulement avec SQLite ça me donnerait cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'd', 4, 'e1'
    'd', 4, 'e2'
    Encore désolé.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    L'idée de Camaie avec la fonction de fenêtrage parait pas mal mais il faut partitionner par la colonne gr au lieu de content:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT
      content,
      ordre,
      gr
    FROM
      (
        SELECT content, ordre, gr,
          row_number() over( partition BY gr ORDER BY ordre DESC) AS rn
        FROM
          essais
      ) AS  tmp
    WHERE
      rn = 1;

  7. #7
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    Impeccable, ça marche !
    c'est donc ça le fenêtrage ...
    auriez-vous un tuto à propos de ces fonctions de fenêtrage, ou simplement de petites explications sur cette requête, car je n'est rien trouvé, et il y a des fonctions que je n'ai pas compris ... (row_number() et over()).

    Merci beaucoup.

  8. #8
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 386
    Points : 3 531
    Points
    3 531
    Billets dans le blog
    1
    Par défaut
    N'oubliez pas le bouton
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  9. #9
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    Citation Envoyé par Golgotha Voir le message
    N'oubliez pas le bouton
    oui, merci, mais il me reste quand même a adapter ça sur la véritable requête (1.5 pages pages A4) , et si je ne maîtrise pas le fonctionnement, je vais avoir du mal ...

    Merci.

    EDIT

    j'ai finis par trouvé ceci :
    http://lalystar.developpez.com/fonct...lytiques/#L3.8

    ça devrait le faire.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il y a aussi un tuto sur le site developpez:
    http://sqlpro.developpez.com/article...clause-window/

    Sinon pour une solution peut-être plus naturelle au problème posé dans la discussion, on pourrait aussi y arriver en fenêtrage de cette manière là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct (first_value(essais.*) over(partition by gr order by ordre desc)).* from essais;
    Avantage: plus court et générique, pas besoin d'énumérer toutes les colonnes.
    Inconvénient: exploite les valeurs composites d'une manière assez spécifique à postgresql.

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

Discussions similaires

  1. problème avec GROUP BY
    Par benjisan dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 14/06/2007, 11h48
  2. [XI] problème avec groupe sur un champ trié par origine ?
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 11/04/2007, 15h31
  3. Problème avec GROUP BY
    Par Korskarn dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/03/2006, 14h35
  4. Problème avec group by...
    Par gdido dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/07/2005, 09h34
  5. [débutant] problème avec Group by
    Par Amenofis dans le forum Débuter
    Réponses: 5
    Dernier message: 25/05/2005, 09h57

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