Probleme de requete avec MAX

Le
Yann
Bonjour à tous,

Voici un exemple de structure de table que j'ai :
User Lettre Espace Timestamp
--
toto C: 546644 1082042841
toto C: 468777 1083685036


L'enregistrement qui m'interresse est celui qui comporte le timestamp le
plus élevé (donc le plus récent)

Comment dois-je écrire ma requete ? Je n'arrive pas à intégrer la fonction
MAX ?

Merci d'avance.

Yann
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fred BROUARD - SQLpro
Le #21711351
SELECT User, Lettre, Espace, MAX(Timestamp)
FROM Matable
GROUP BY User, Lettre, Espace

ATTENTION cepandant : tu as utilisé des mots réservés du SQL comme nom de colonne. C'est la chose à éviter.

Si ta requête ne passe pas, essaye :

SELECT "User", Lettre, Espace, MAX("Timestamp")
FROM Matable
GROUP BY "User", Lettre, Espace

En effet les mots User et Timestamp sont des noms réservés de SQL !

A +


User Lettre Espace Timestamp
--------------------------------------
toto C: 546644 1082042841
toto C: 468777 1083685036

Yann a écrit:
Bonjour à tous,

Voici un exemple de structure de table que j'ai :
User Lettre Espace Timestamp
--------------------------------------
toto C: 546644 1082042841
toto C: 468777 1083685036


L'enregistrement qui m'interresse est celui qui comporte le timestamp le
plus élevé (donc le plus récent)

Comment dois-je écrire ma requete ? Je n'arrive pas à intégrer la fonction
MAX ?

Merci d'avance.

Yann





--
Frédéric BROUARD, MVP MS SQL Server. Expert Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Yann
Le #21711341
Merci mais ce n'est pas tout à fait cela.

En effet, avec ta syntaxe j'ai comme résultat :
toto C: 546644 1082042841
toto C: 468777 1083685036

Je suppose que c'est du au fait que Espace soit différent dans les deux
enregistrements. Par contre, si j'écris :

SELECT user, lettre, MAX([timestamp]) AS Expr1
FROM Matable
GROUP BY user, lettre

J'obtiens :
toto C: 1083685036 soit l'enregistrement qui contient le plus grand
timestamp. Donc j'essaye de rajouter Espace dans le select mais là j'ai une
erreur (à priori à cause du fait que Espace ne soit pas dans la clause GROUP
BY).

Comment je pourrais faire pour avoir comme résultat :
toto C: 468777 1083685036

soit l'ensemble des valeurs de l'enregistrement comportant le Timestamp le
plus élevé lorsque user et lettre sont identique ?

Yann


"Fred BROUARD - SQLpro" de news:
SELECT User, Lettre, Espace, MAX(Timestamp)
FROM Matable
GROUP BY User, Lettre, Espace

ATTENTION cepandant : tu as utilisé des mots réservés du SQL comme nom de


colonne. C'est la chose à éviter.

Si ta requête ne passe pas, essaye :

SELECT "User", Lettre, Espace, MAX("Timestamp")
FROM Matable
GROUP BY "User", Lettre, Espace

En effet les mots User et Timestamp sont des noms réservés de SQL !

A +


User Lettre Espace Timestamp
--------------------------------------
toto C: 546644 1082042841
toto C: 468777 1083685036

Yann a écrit:
> Bonjour à tous,
>
> Voici un exemple de structure de table que j'ai :
> User Lettre Espace Timestamp
> --------------------------------------
> toto C: 546644 1082042841
> toto C: 468777 1083685036
>
>
> L'enregistrement qui m'interresse est celui qui comporte le timestamp le
> plus élevé (donc le plus récent)
>
> Comment dois-je écrire ma requete ? Je n'arrive pas à intégrer la


fonction
> MAX ?
>
> Merci d'avance.
>
> Yann
>
>

--
Frédéric BROUARD, MVP MS SQL Server. Expert Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Etienne SOBOLE
Le #21711331
"Yann" c7vfp4$nre$
En effet, avec ta syntaxe j'ai comme résultat :
toto C: 546644 1082042841
toto C: 468777 1083685036
Je suppose que c'est du au fait que Espace soit différent dans les deux
enregistrements. Par contre, si j'écris :



Oui

Comment je pourrais faire pour avoir comme résultat :
toto C: 468777 1083685036



D'apres moi c'est impossible.
tout du moins avec un requete simple.

Pour la bonne et simple raison que si tu as deux timestamp egaux (et
maximum) mais pas des espaces identiques,
le moteur SQL va devoir faire un choix.

Hors le moteur SQL ne fait jamais de choix.
Donc c'est pas possible, sauf à faire:

SELECT * FROM table WHERE timestamp IN (SELECT max(timestamp) AS timestamp
FROM table) LIMIT 1;
ou plus simple
SELECT * FROM table ORDER BY timestamp DESC LIMIT 1;
m'enfin a mon avis c'est pas plus rapide.

Enfin bon, c'est un avis purement personnel.

Etienne
Yann
Le #21711321
Merci pour ces précisions.

Pour info, je ne peux pas avoir deux timestamp identique avec des espaces
identiques.

Par contre j'ai essayé tes deux syntaxes et j'ai comme retour une erreur :

[Microsoft][OBDC SQL Server Driver][SQL Server]Line 1 : Incorrect syntax
near 'LIMIT'

Je suis sous SQL Server 2000.

Yann
"Etienne SOBOLE" news:40a34631$0$17915$
"Yann" c7vfp4$nre$
> En effet, avec ta syntaxe j'ai comme résultat :
> toto C: 546644 1082042841
> toto C: 468777 1083685036
> Je suppose que c'est du au fait que Espace soit différent dans les deux
> enregistrements. Par contre, si j'écris :

Oui

> Comment je pourrais faire pour avoir comme résultat :
> toto C: 468777 1083685036

D'apres moi c'est impossible.
tout du moins avec un requete simple.

Pour la bonne et simple raison que si tu as deux timestamp egaux (et
maximum) mais pas des espaces identiques,
le moteur SQL va devoir faire un choix.

Hors le moteur SQL ne fait jamais de choix.
Donc c'est pas possible, sauf à faire:

SELECT * FROM table WHERE timestamp IN (SELECT max(timestamp) AS timestamp
FROM table) LIMIT 1;
ou plus simple
SELECT * FROM table ORDER BY timestamp DESC LIMIT 1;
m'enfin a mon avis c'est pas plus rapide.

Enfin bon, c'est un avis purement personnel.

Etienne


Publicité
Suivre les réponses
Poster une réponse
Anonyme