Question

En termes simples, j'ai une table avec, entre autres, une colonne pour horodatages. Je veux obtenir la ligne avec la plus récente horodatage (à savoir la plus grande valeur). Actuellement, je fais ceci:

SELECT * FROM table ORDER BY timestamp DESC LIMIT 1

Mais je préférerais faire quelque chose comme ceci:

SELECT * FROM table WHERE timestamp=max(timestamp)

Cependant, SQLite rejette cette requête:

SQL error: misuse of aggregate function max()

Le confirme ce comportement (en bas de page):

  

Les fonctions d'agrégat ne peuvent être utilisées dans une instruction SELECT.

Ma question est: est-il possible d'écrire une requête pour obtenir la ligne avec le plus grand horodatage sans la commande de sélection et de limiter le nombre de lignes retournées à 1? Cela semble qu'il devrait être possible, mais je suppose que mon SQL-fu est pas à la hauteur.

Était-ce utile?

La solution

SELECT * from foo where timestamp = (select max(timestamp) from foo)

ou, si SQLite insiste sur le traitement des sous-requêtes sous forme d'ensembles,

SELECT * from foo where timestamp in (select max(timestamp) from foo)

Autres conseils

Il y a plusieurs façons de peau d'un chat.

Si vous avez une colonne d'identité qui a une fonctionnalité d'incrémentation automatique, une requête plus rapide surviendrait si vous retournez le dernier enregistrement par ID, en raison de l'indexation de la colonne, à moins bien sûr que vous souhaitez mettre un index sur la colonne horodatage.

SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

Je pense avoir répondu à cette question 5 fois dans la semaine dernière maintenant, mais je suis trop fatigué pour trouver un lien vers un de ceux en ce moment, si elle est ici à nouveau ...

SELECT
     *
FROM
     table T1
LEFT OUTER JOIN table T2 ON
     T2.timestamp > T1.timestamp
WHERE
     T2.timestamp IS NULL

Vous êtes à la recherche essentiellement de la ligne où aucune autre ligne correspond qui est plus tard que.

NOTE: Comme indiqué dans les commentaires, cette méthode ne fonctionnera pas aussi bien dans ce genre de situation. Il fonctionnera généralement mieux (pour SQL Server au moins) dans des situations où vous voulez la dernière ligne pour chaque client (à titre d'exemple).

vous pouvez simplement faire

SELECT *, max (horodatage) FROM table

Edit: En fonction d'agrégation ne peut pas être utilisé comme cela, il donne donc une erreur. Je suppose que SquareCog avait suggéré était la meilleure chose à faire

SELECT * FROM table WHERE timestamp = (select max(timestamp) from table)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top