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

MS SQL Server Discussion :

SQL premier enregistrement dans un group by


Sujet :

MS SQL Server

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut SQL premier enregistrement dans un group by
    Bonjour ,

    comment retrouver le premier enregistrement (ou le dernier) dans une requete
    avec group by ? il y a MAX,MIN,SUM ... mais premier et dernier ?

    avec access il y a first et last et avec SQL SERVEUR ?

    merci

  2. #2
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    La notion de premier et dernier enregistrement n'existe pas pour un SGBDR !
    Et là vous confondez certainement ou vous n'avez pas bien expliqué.
    Même accès ne possède pas une commande qui retourne le premier enregistrement, ni même le dernier...
    Que voulez vous exactement ?

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Je ne connais pas beaucoup sql serveur mais access oui !

    voici un exemple de requête d'une appli boursière
    avec une table impcours (code,date,premier,plus haut,plus bas,dernier)
    qui retourne la valeur de la première ligne de la colonne premier, le max de la colonne plus haut,le mini de la colonne plus bas et la valeur de la dernier ligne de la colonne dernier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
    Impcours.code, 
    Impcours.date, 
    First(Impcours.premier) AS PremierDepremier, 
    Max(Impcours.[plus haut]) AS [MaxDeplus haut], 
    Min(Impcours.[plus bas]) AS [MinDeplus bas], 
    Last(Impcours.dernier) AS DernierDedernier,
    Sum(Impcours.volume) AS SommeDevolume,
    Max(Impcours.[HEURE]) AS [MaxDeHEURE]"
    donc pas d’équivalent avec sql serveur ?
    merci pour vos réponses

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 896
    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 896
    Points : 53 126
    Points
    53 126
    Billets dans le blog
    6
    Par défaut
    Non; First est une imbécilité d'Access et contrevient aux notions fondatrice des SGBDR...

    Expliquez, en respectant la charte de postage, ce que vous voulez obtenir :
    http://www.developpez.net/forums/showthread.php?t=96701

    A +

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    En SQL Server, il y a un argument appelé TOP dans la clause SELECT qui permet d'avoir un nombre limité d'enregistrement.

    Ainsi;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT TOP 1 premier
    FROM ImpCours
    ORDER BY premier
     
    SELECT TOP 1 dernier
    FROM ImpCours
    ORDER BY dernier DESC
    La première sélection retourne 1 seul enregistrement, contenant la première valeur de la colonne premier, selon l'ordre de premier.
    La deuxième sélection retourne 1 seul enregistrement, contenant la première valeur de la colonne dernier selon l'ordre inverse de dernier, et est donc équivalente a la dernière valeur de dernier.

    Attention, il faut toujours utiliser la clause ORDER BY pour trier les résultats, sinon on s'expose à ne pas toujours avoir la même valeur. Selon les insertions futures, le résultat pourra évidemment changer.

    TOP étant un argument de la clause SELECT, il modifie le résultat de toute la sélection, et non pas d'une colonne en particulier. Pour l'utiliser dans une sélection avec colonnes multiples comme dans ton exemple, il faudra utiliser des sous-sélections.

    L'argument TOP de la clause SELECT n'est pas portable (il n'existe pas en Oracle, par exemple).

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Non; First est une imbécilité d'Access et contrevient aux notions fondatrice des SGBDR...

    Expliquez, en respectant la charte de postage, ce que vous voulez obtenir :
    http://www.developpez.net/forums/showthread.php?t=96701

    A +

    Quelle drôle de réponse !!! la personne cherche une solution technique , on lui parle de règlement !!

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 896
    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 896
    Points : 53 126
    Points
    53 126
    Billets dans le blog
    6
    Par défaut
    Ce n'est pas ma faute si ACCESS se vante d'être un SGBDR mais n'en est absolument pas un !

    Les personnes qui utilisent access ou autre pseudo SGDBR utilisent des commandes imbéciles qui n'existent nulle part ailleurs et qui font du n'importe quoi et estimerait que l'on doit reproduire leurs ignominies sur de vrais SGBDR !

    Autrement dit, si l'on veut utiliser proprement un SGBDR il y a bien des règles à respecter...

    A +

  8. #8
    Nouveau membre du Club
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Je rajouterais que la question pouvait etre utile a d'autre personne, et que aucune question n'est bête... Et puis parfois on travaille pour des entreprises et on ne choisit pas forcement sur quoi on opère ^^

    Je pense que la reponse :
    il y a un argument appelé TOP dans la clause SELECT qui permet d'avoir un nombre limité d'enregistrement.
    Est plus constructif que :
    Non; First est une imbécilité d'Access et contrevient aux notions fondatrice des SGBDR...

    Expliquez, en respectant la charte de postage, ce que vous voulez obtenir :
    http://www.developpez.net/forums/showthread.php?t=96701

    A +
    MERCI Raynald

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 38
    Points : 94
    Points
    94
    Par défaut
    Je reprends cette discussion, car le besoin est permanent, dans toutes les applis, on utilise ce genre de requête, et cette fonction manque réellement. Mais avec le nouvelle version de SQL-Server, sait-on jamais...

    Le besoin : simple ! Dans mon appli, j'ai l'historique du cours des devises, ce qui me permet de valoriser nos commandes (ventes, achats, inter-site, ...). Et pour valoriser le business futur, la règle dit "le dernier taux connu", sous-entendu, le taux qui correspond à la date la plus grande. On peut alors faire de différentes manières :

    1) une vue qui nous donne le max de la date pour chaque devise ; puis une vue qui fait une jointure sur la date et le devise ;

    2) Ca revient au même, c'est une vue avec un select imbriqué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Devise, DateCours, Cours AS DernierCoursConnu
    FROM    CoursDevise A
    WHERE     (DateCours =
                              (SELECT     MAX(datecours)
                                FROM       CoursDevise B
                                WHERE      B.devise = A.devise))
    Vous reconnaitrez que c'est un peu lourd pour avoir "le taux du dernier jour".

    J'aimerais donc savoir s'il n'y a pas dans les versions actuelles, une manière plus simple de l'avoir, du style :
    3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Devise, 
                       LAST DateCours, Cours AS DernierCoursConnu
    FROM    CoursDevise 
    GROUP BY Devise
    ORDER BY DateCours
    Je suis d'accord pour dire que la notion First/Last d'un SGBDR n'a pas de sens... Sauf quand les enregistrements sont triés

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

    On peut utiliser les fonctions fenêtrées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    WITH CTE AS (
      SELECT 
          Devise, 
          DateCours, 
          Cours ,
          RANK() OVER( PARTITION BY Devise ORDER BY DateCours DESC) As Rang 
      FROM    CoursDevise 
    )
    SELECT 
        Devise,
        DateCours,
        Cours AS DernierCoursConnu
    WHERE Rang = 1

  11. #11
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 38
    Points : 94
    Points
    94
    Par défaut
    Ca a effectivement l'air redoutable d'efficacité...
    Je vais chercher de la doc (FAQ, Tuto) pour comprendre les finesses de cette syntaxe.

    Par contre chez moi, ça ne marche pas. Mais avec notre version préhistorique de SQL-Server, je ne suis pas surpris. Pour info, cette astuce existe à partir de quelle version ?

    ... C'est le pb d'une boite qui se fait racheter par un groupe international... Ca fait des année qu'on demande l'upgrade de version, mais la demande d'invest est systématiquement rejetée

  12. #12
    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
    Sauf erreur de ma part, depuis la version 2005.

    quelle est votre version ?

  13. #13
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 38
    Points : 94
    Points
    94
    Par défaut
    On ne rigole pas ! J'ai prévenu, on est préhistorique !
    Sur un serveur NT4, on a la 6.5 (on est en train de migrer, cette plateforme sera à la benne vers mars/avril) ;
    et un tout neuf, sur Windows2000, SQL-Server Version 7 (et c'est là dessus que je développe).

    Et oui, elle date d'il y a 8 ans au moins, mais notre boîte a été rachetée 3 fois en 8 ans, alors à chaque fois, on repousse de 3 ans...

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 896
    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 896
    Points : 53 126
    Points
    53 126
    Billets dans le blog
    6
    Par défaut
    Vous n'aurez rien de tout cela en version SQL Server 7 qui d'ailleurs n'est plus supportée par le OS actuels. Même SQL Server 2000 n'est plus supportés par les OS WIndows actuels....

    A +

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par JeanMiG Voir le message
    On ne rigole pas ! J'ai prévenu, on est préhistorique !
    Sur un serveur NT4, on a la 6.5 (on est en train de migrer, cette plateforme sera à la benne vers mars/avril) ;
    et un tout neuf, sur Windows2000, SQL-Server Version 7 (et c'est là dessus que je développe).

    Et oui, elle date d'il y a 8 ans au moins, mais notre boîte a été rachetée 3 fois en 8 ans, alors à chaque fois, on repousse de 3 ans...
    Utiliser une version aussi vieille risque de vous poser pas mal de problèmes. Avez-vous considérer migrer vers des solutions open source et/ou gratuites comme PostgreSQL ou CouchDB?

  16. #16
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    J'interviens tard sur ce topic, mais c'est juste pour apporter un complément d'information.
    Parmi les nouveautés de SQL Server 2012, 2 nouvelles fonctions ont fait leur apparition
    Il s'agit de FIRST_VALUE et LAST_VALUE

    Ces 2 fonctions, comme leur nom l'indique, retournent respectivement la première valeur et la dernière valeur à partir d'un ensemble ordonné de valeurs. Ces 2 fonctions peuvent être très utiles. On peut par exemple calculer, à la volée, à l'intérieur d'un jeu de résultats, la différence entre une valeur initiale et la valeur en cours, etc..

    Pour illustrer au travers un exemple simple, je vais reprendre l'exemple ci-dessus donné par JeanMiG (CoursDevis).

    1 - Création et peuplement de la table
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE TABLE CoursDevise  ( 
       Devise  VARCHAR(5)  NOT NULL , 
       DateCours  DATETIME NOT NULL, 
       Cours  DECIMAL(18,6) NOT NULL ); 
    ALTER TABLE dbo.CoursDevise ADD CONSTRAINT PK_CoursDevise PRIMARY KEY CLUSTERED (Devise, DateCours, Cours);
     
    INSERT INTO CoursDevise   (Devise,  DateCours,  Cours) 
    VALUES 
     ('A', '2013-01-01T00:00:00',  100.10) ,   
     ('A', '2013-01-02T00:00:00',  100.20) , 
     ('A', '2013-01-03T00:00:00',  100.30) , 
     ('B', '2013-01-01T00:00:00',  200.10) , 
     ('B', '2013-01-02T00:00:00',  200.20) , 
     ('B', '2013-01-03T00:00:00',  200.30) ,
     ('B', '2013-01-04T00:00:00',  200.40) ;

    2 - Exemple d'utilisation de la fonction FIRST_VALUE
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Devise, Cours,  DateCours, 
       FIRST_VALUE (DateCours) OVER ( PARTITION BY Devise  ORDER BY DateCours ASC  ) AS FirstDateCours,  
       FIRST_VALUE (DateCours) OVER ( PARTITION BY Devise  ORDER BY DateCours DESC ) AS LastDateCours 
    FROM  CoursDevise 
    ORDER BY Devise, DateCours

    - Résultat :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Devise	Cours	DateCours	FirstDateCours	LastDateCours
    A	100.10	2013-01-01 	2013-01-01 	2013-01-03
    A	100.20	2013-01-02 	2013-01-01 	2013-01-03
    A	100.30	2013-01-03 	2013-01-01 	2013-01-03
    B	200.10	2013-01-01 	2013-01-01 	2013-01-04
    B	200.20	2013-01-02 	2013-01-01 	2013-01-04
    B	200.30	2013-01-03 	2013-01-01 	2013-01-04
    B	200.40	2013-01-04 	2013-01-01 	2013-01-04

    Pour plus d'information
    http://msdn.microsoft.com/en-us/library/hh213018.aspx

    A+

Discussions similaires

  1. afficher les 10 premiers enregistrements pour chaque groupe
    Par freestyler dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/06/2008, 15h46
  2. Premier Enregistrement dans un formulaire
    Par nomade333 dans le forum IHM
    Réponses: 4
    Dernier message: 24/12/2007, 18h19
  3. Sélection du premier enregistrement de chaque groupe
    Par mout1234 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 15/05/2007, 16h27
  4. Inno Setup : Enregistrer dans la bdr le group
    Par yoghisan dans le forum Outils
    Réponses: 1
    Dernier message: 05/06/2005, 16h04
  5. [SQL][ACCESS]Compter le nombres d'enregistrement dans deux..
    Par pc152 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 05/06/2004, 12h30

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