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

Développement SQL Server Discussion :

[Query] Problème de requête


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Points : 207
    Points
    207
    Par défaut [Query] Problème de requête
    Bonjour,

    Actuellement je souhaite interroger une table à 3 colonnes : col1 (int), col2 (varchar(16)), col3 Datetime.

    Je voudrais avoir les dernières valeurs en temps (par rapport à la col3) pour différentes valeur de la col1.

    Ex :
    Record1 : 1, 123, 01/01/2012
    Record2 : 2, 123, 01/01/2012
    Record3 : 2, 456, 01/03/2012
    Je souhaite recupérer :
    Record1 : 1, 123, 01/01/2012
    Record3 : 2, 456, 01/03/2012
    j'ai tenté le query suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT col1, MIN(col2), MAX(col3)
    FROM table
    WHERE col1 in (1,2)
    GROUP BY col1
    Cela fonctionne mais ma col1 etant du varchar je ne souhaite pas mettre de fonction.

    Si quelqu'un avait une idée ?

    Merci
    Michaël

  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 391
    Points
    18 391
    Par défaut
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With TMP (col1, col2, col3, rn) as
    (
    SELECT col1, col2, col3
         , row_number() over(partition by col1 order by col3 desc)
      FROM table
    )
    SELECT col1, col2, col3
      FROM TMP
     WHERE rn = 1;

  3. #3
    Membre actif
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Points : 207
    Points
    207
    Par défaut
    Merci Waldar pour ta réponse.

    Cela fonctionne en effet dans Management studio mais en essayant de la mettre sous forme de requête par ADO.NET cele ne marche plus.

    Faut il créer une vue ? sachant que ce query sera soumis à de gros tests de performance.

    Merci
    Michaël

  4. #4
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    A mon avis le group by col1 est aussi gourmand que le partition by col1. (j'avoue je n'ai pas testé)

  5. #5
    Membre actif
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Points : 207
    Points
    207
    Par défaut
    En fait cela marche tres bien en ADO.NET c'est moi qui m'était trompé ...

    Voici finalement ce que je pense être assez comprehensible pour mon niveau et j'espere performant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT lcr.col1, lcr.col2, lcr.col3
    FROM MyTable lcr , (SELECT lcr2.col1, MAX(lcr2.col3) as timestampa 
                         FROM MyTable lcr2 
                         WHERE lcr2.col1 in (1, 2) 
                          GROUP BY lcr2.col1) a
    WHERE lcr.col1 = a.col1
    AND lcr.Timestamp =  a.timestampa
    Si je peux avoir une confirmation d'expert


    Merci

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    j'espere performant
    Seul le plan de requête + les statistiques (SET STATISTICS IO / TIME ON) vous le diront
    A priori je déplacerai le WHERE dans la sous requête, sinon on va calculer le MAX() pour chaque ligne de la requête principale
    Peut-être qu'une expression de table commune sera mieux ...

    @++

  7. #7
    Membre actif
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Points : 207
    Points
    207
    Par défaut
    Grand Merci pour les réponses ++

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

Discussions similaires

  1. problème de requête query
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 7
    Dernier message: 01/07/2005, 16h28
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  3. Problème de requètes concurentes
    Par Emmanuel.G dans le forum XMLRAD
    Réponses: 3
    Dernier message: 08/08/2003, 16h51
  4. Réponses: 2
    Dernier message: 16/07/2003, 14h40
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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