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
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
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 ?
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
donc pas d’équivalent avec sql serveur ?
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]"
merci pour vos réponses
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 +
En SQL Server, il y a un argument appelé TOP dans la clause SELECT qui permet d'avoir un nombre limité d'enregistrement.
Ainsi;
La première sélection retourne 1 seul enregistrement, contenant la première valeur de la colonne premier, selon l'ordre de premier.
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 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).
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 +
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 :
Est plus constructif que :il y a un argument appelé TOP dans la clause SELECT qui permet d'avoir un nombre limité d'enregistrement.
MERCI RaynaldNon; 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 +
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é
Vous reconnaitrez que c'est un peu lourd pour avoir "le taux du dernier jour".
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))
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)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
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
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
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
Sauf erreur de ma part, depuis la version 2005.
quelle est votre version ?
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...
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 +
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+
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager