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 :

Group By sur un seul champ en ignorant les autres


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Group By sur un seul champ en ignorant les autres
    Bonjour,

    Je travaille actuellement sous sql server 2008 R2.

    J'ai une requête que je n'arrive pas à faire, elle doit pourtant être simple mais je me casse la tête dessus.

    J'ai une table avec des ordres de fabrication divisés en opération.
    Chaque opération a une date et une heure différentes des autres.


    Ordre
    de fabrication||||---------Date----------||||Heure||||||Numéros d'Opération

    OFS-0000864||||2013-09-25 00:00:00.000||||00000|||||| 60
    OFS-0000864||||2013-09-26 00:00:00.000||||83549||||||80
    OFS-0000864||||2013-09-27 00:00:00.000||||83986||||||100
    OFS-0001000||||2013-09-26 00:00:00.000||||53039||||||30
    OFS-0001084||||2013-09-25 00:00:00.000||||55368||||||10
    OFS-0001084||||2013-09-30 00:00:00.000||||55438||||||30
    OFS-0001085||||2013-09-25 00:00:00.000||||55579||||||10



    Je veux récupéré la valeur max des numéros d'opération pour chaque OF :

    Exemple : pour l'OF 864 j'aurai uniquement cette ligne :

    OFS-0000864 2013-09-27 00:00:00.000 83986 100

    Avec la requête suivante je garde toujours plusieurs tuples par OF puisque le Group by s'applique sur un ensemble de 3 champs ce qui est logique..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select prodid,REALIZEDENDDATE,REALIZEDENDTIME,max(oprnum)
    from Latable
    where DATAAREAID ='lolo'
    group by prodid,REALIZEDENDDATE,REALIZEDENDTIME;

    j'ai testé plusieurs solutions mais je sèche ...

    La solution ultime serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select prodid,REALIZEDENDDATE,REALIZEDENDTIME,max(oprnum)
    from Latable
    where DATAAREAID ='lolo'
    group by prodid;
    Mais c'est une mauvaise utilisation de group by car il n'englobe pas tous les champs et forcément le SGBD hurle ^^

    Avez-vous une solution?


    Merci.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ;WITH CTE AS (
    SELECT prodid,REALIZEDENDDATE,REALIZEDENDTIME,oprnum, ROW_NUMBER() OVER(PARTITION BY prodid ORDER BY oprnum DESC) AS Rn
    FROM Latable
    WHERE DATAAREAID ='lolo'
    )
    SELECT prodid,REALIZEDENDDATE,REALIZEDENDTIME,oprnum
    FROM CTE
    WHERE Rn = 1


  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci.

    Cela marche parfaitement !!!

    Mais pourriez-vous m'expliquer brièvement cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ROW_NUMBER() OVER(PARTITION BY prodid ORDER BY oprnum DESC)
    Merci pour cette réponse plus que rapide.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    La fonction de fenêtrage ROW_NUMBER() permet d'attribuer un numéro à partir de 1 à chaque ligne de la fenêtre (définie par la clause PARTITION BY) selon l'ordre défini par la cause ORDER BY

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Utile

    Merci.

    Bonne Journée

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/07/2009, 18h12
  2. Utilisation de Distinct sur un seul champ!
    Par Bils dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/11/2007, 09h31
  3. [Requete] qui n'affiche pas les doublons mais sur un seul champs
    Par joseph.breham dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/12/2006, 14h57
  4. [9i, débutant] Clause DISTINCT sur un seul champ
    Par JYves dans le forum Oracle
    Réponses: 11
    Dernier message: 06/09/2006, 17h08
  5. Distinct sur un seul champ...
    Par Noodles dans le forum Langage SQL
    Réponses: 16
    Dernier message: 04/01/2005, 09h36

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