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 en récupérant la première date sur une clause d'autres champs


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 87
    Points : 56
    Points
    56
    Par défaut GROUP BY en récupérant la première date sur une clause d'autres champs
    Bonjour,

    Mon titre n'est peut être pas le plus descriptif possible, mais me voici confronté au pb suivant, je pensais resoudre le problème avec une sous requête mais je n'y arrive pas :-s :

    Mon jeu de données ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id, Dt, Param1, Param2 FROM maTable ORDER BY Dt DESC
    -id---Dt------------------------Param1---Param2
    -01--2009-01-13 18:46:02.000---p1_5-----1
    -02--2009-01-13 16:07:38.000---p1_5-----1
    -03--2009-01-12 16:17:23.000---p1_3-----1
    -04--2009-01-12 13:34:07.000---p1_3-----1
    -05--2009-01-12 12:49:31.000---p1_2-----1
    -06--2009-01-11 18:52:09.000---p1_5-----1
    -07--2009-01-11 18:51:49.000---p1_5-----2
    -08--2009-01-11 17:54:51.000---p1_5-----2
    -09--2009-01-11 14:57:09.000---p1_3-----2
    -10--2009-01-10 14:25:05.000---p1_3-----2
    -11--2009-01-10 14:14:59.000---p1_1-----2
    -12--2009-01-08 22:08:26.000---p1_5-----1

    Je voudrais faire un GROUP BY Sur Param1, Param2 mais en gardant une notion de temps : La date pour les enregistrements retournées doit être la première date chronologique "du GROUP BY" (donc faire un GROUP BY sans tenir compte des dates réelles mais en créant par exemple une DT2 correspondant à la première date avant changement), mais si un "groupe" se retrouve avant ou après, je doit quand même le récupérer.

    Mon jeu de données devrait donc être le suivant :
    -02--2009-01-13 16:07:38.000---p1_5-----1
    -04--2009-01-12 13:34:07.000---p1_3-----1
    -05--2009-01-12 12:49:31.000---p1_2-----1
    -06--2009-01-11 18:52:09.000---p1_5-----1
    -08--2009-01-11 17:54:51.000---p1_5-----2
    -10--2009-01-10 14:25:05.000---p1_3-----2
    -11--2009-01-10 14:14:59.000---p1_1-----2
    -12--2009-01-08 22:08:26.000---p1_5-----1

    Du coup, je me demande si on peut vraiment parler de GROUP BY vu que je dois garder l'enregistrement précédent (ex. id:12) même si celui ci existe déjà (en Id:02). Du coup, dois-je obligatoirement passer par un curseur pour manipuler les dates ou existe-il y moyen en utilisant des requêtes ?

    Merci de votre aide, en ésperant pouvoir m'en sortir
    Damien.

  2. #2
    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 386
    Points
    18 386
    Par défaut
    Il y a de nombreuses méthodes pour s'en sortir en pur SQL.
    Quel est votre SGBD ?

  3. #3
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    SQL2000 et c'est une PS qui me retourne le jeu de résultats. J'aurai aimé faire ça sans utiliser de curseur, je pensais qu'avec une sous requête c'était bon et assez rapidement, mais après plusieurs heures, je n'ai pas réussi à avoir les bonnes données..pourtant, je me doute que c'est possible.
    Il doit me manquer un petit quelque chose, surement du fait que ça fait pas mal de temps que je n'ai pas fait du "SQL pure"...donc si tu peux me remettre sur la bonne piste, ça serait avec grand plaisir

    Merci bien.

  4. #4
    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 386
    Points
    18 386
    Par défaut
    D'abord on fait une requête pour trouver la date minimum par jour, param1 et param2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select min(dt) dt, param1, param2
    from maTable
    group by cast(cast(dt as varchar(11)) as smalldatetime), param1, param2
    Je ne suis pas un champion des conversions en SQL Server, il y a probablement plus propre que cette double conversion, l'idée c'est de faire un group by sur la journée sans les heures.

    Une fois que vous avez cette requête, il suffit de la relier à votre table sur ces trois colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select M.id, M.Dt, M.param1, M.param2
    from
    (select min(dt) dt, param1, param2
    from maTable
    group by cast(cast(dt as varchar(11)) as smalldatetime), param1, param2) AS T
        inner join MaTable AS M
         ON M.dt = T.dt
        AND M.param1 = T.param1
        AND M.param2 = T.param2

  5. #5
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    OK merci bien, mes 1eres requêtes étaient un peu près identique, mais avec une jointure croisée...mon soucis venait surement de là ...je regarde ça dès demain et je n'oublierai pas le tag "résolu" si tout va bien.

    En tout cas, merci bien pour ton aide.

  6. #6
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    SELECT min(dt) dt, param1, param2
    FROM maTable
    GROUP BY cast(cast(dt AS varchar(11)) AS smalldatetime), param1, param2Je ne suis pas un champion des conversions en SQL Server, il y a probablement plus propre que cette double conversion, l'idée c'est de faire un group by sur la journée sans les heures.
    En fait, les données regroupées peuvent être sur plusieurs jours, donc l'idée de la double conversion sur le jour n'est pas forcement vraie ...

    Si tu as une autre solution, je suis toujours preneur.
    Merci,
    Damien.

    PS :
    Pour éviter ta double conversion et garder ton principe, on peut utiliser la fonction SQL DAY(dt), ça marche, mais ne m'aide pas dans mon contexte donc.
    Vu que les il n'y a pas de fréquence fixe entre les différents intervalles, je me demande si il ne faut pas inclure une sous requête récupérant la date Min avant changement, pour mettre à jour sur les enregistrements concernés, mais là avant le GROUP BY, mais là je bloque...

  7. #7
    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 386
    Points
    18 386
    Par défaut
    Alors j'ai raté quelque chose au niveau de l'énoncé !
    Pouvez-vous fournir un exemple qui implémente le cas de figure dont vous parlez ?

  8. #8
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Alors j'ai raté quelque chose au niveau de l'énoncé !
    Pouvez-vous fournir un exemple qui implémente le cas de figure dont vous parlez ?
    Le but serait de grouper les données mais que pour les données identiques (Param1 et Param2) qui se succèdent, en affectant l'heure MIN au "groupement". Il n'y a aucune logique dans la fréquence des heures, ça peut être une minute comme 2 jours, et le même GROUP Param1, Param2 peut se retrouver dans la même journée mais un couple différent de Param1, Param2 peut les séparer(ce qui veut dire que prendre la date MIN sur le jour, et si on pouvait le faire, n'est pas forcement vrai).

    De plus j'aimerai bien ajouter un champ "DtFin" au jeu de données qui correspond à la première Date Heure Supérieur qui ne fait pas parti du groupement (le premier enregistrement ayant forcement comme dateHeure la dateHeure actuelle)....

    Un exemple concret serait la ou les prises de mesure via un matériel par un opérateur (sans heure fixe) sur 2 caractéristiques d'un produit, je voudrai arriver à dire on faisait tel produit de telle heure à telle heure et les ordonner pour sélectionner la tranche de production.

    Je n'arrive pas à avancer, mais je pense que c'est qu'un problème de "logique" et de mise en forme des sous requêtes...mais je me vraiment.

    Merci encore pour ton/votre aide.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Est-ce que SQL 2000 supporte les Common Table Expressions genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WITH NewTable as (select ... from ... GROUP by ...)
    select ... from NewTable Where ...
    ?

  10. #10
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Mercure Voir le message
    Est-ce que SQL 2000 supporte les Common Table Expressions genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WITH NewTable as (select ... from ... GROUP by ...)
    select ... from NewTable Where ...
    ?
    Je ne connais pas, j'ai donc chercher un peu, visiblement c'est supporté depuis SQLServer2005. Je cherche pour voir si ça peut m'aiguiller (visiblement, ça ressemble un peu aux tables dérivées de SQL2000...mais hum...)

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut DB2
    On pourrait essayer çà, mais j'ai évidemment pas testé (je suis sous DB2):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    WITH NewTable as (
    SELECT id, MIN(Dt) TSMIN, Param1, Param2 
    FROM maTable 
    GROUP BY id, Param1, Param2
    )
    SELECT a.id, a.TSMIN, MAX(b.dt) TSMAX, a.Param1, a.Param2 
    FROM NewTable a
    JOIN maTable  b on
    b.Param1 = a.Param1
    AND b.Param2 = a.Param2
    GROUP BY a.id, a.Param1, a.Param2
    ORDER BY a.TSMIN, a.Param1, a.Param2

  12. #12
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Mercure Voir le message
    On pourrait essayer çà, mais j'ai évidemment pas testé (je suis sous DB2):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    WITH NewTable as (
    SELECT id, MIN(Dt) TSMIN, Param1, Param2 
    FROM maTable 
    GROUP BY id, Param1, Param2
    )
    SELECT a.id, a.TSMIN, MAX(b.dt) TSMAX, a.Param1, a.Param2 
    FROM NewTable a
    JOIN maTable  b on
    b.Param1 = a.Param1
    AND b.Param2 = a.Param2
    GROUP BY a.id, a.Param1, a.Param2
    ORDER BY a.TSMIN, a.Param1, a.Param2
    Je te remercie; mais le pb c'est que je suis sous SQL2000 et non 2005 (donc non supporté visiblement). Mais j'en prends note et je vais voir si ça peut m'aider.

    Merci.

  13. #13
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2003
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    Visiblement, ce n'est pas aussi simple que je le pensais....
    Si vous pouvez m'aider, je suis toujours sur ce pb, et en sql2000...donc pas de CTE.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/03/2008, 10h10
  2. [RegEx] est-il possible d'extraire une date sur une page distante ?
    Par mitmit dans le forum Langage
    Réponses: 1
    Dernier message: 26/04/2007, 11h35
  3. Réponses: 7
    Dernier message: 25/04/2007, 15h38
  4. Réponses: 2
    Dernier message: 01/03/2007, 17h04
  5. Champs date sur une page web
    Par jpdolloils dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 17/07/2006, 13h13

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