Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme de requete avec MAX

4 réponses
Avatar
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

4 réponses

Avatar
Fred BROUARD - SQLpro
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" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Yann
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" a écrit dans le message
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" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Avatar
Etienne SOBOLE
"Yann" a écrit dans le message de news:
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
Avatar
Yann
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" a écrit dans le message de
news:40a34631$0$17915$
"Yann" a écrit dans le message de news:
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