Les fonctions d'agrégation dans la clause where dans SQLite
Tout simplement, j'ai une table avec, entre autres choses, une colonne pour l'horodatage. Je veux obtenir la ligne la plus récente (c'est à dire la plus grande valeur) timestamp. Actuellement, je suis en train de faire ceci:
SELECT * FROM table ORDER BY timestamp DESC LIMIT 1
Mais je préfère 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()
La la documentation confirme ce comportement (en bas de page):
Fonctions d'agrégation ne peut être utilisé dans une instruction SELECT.
Ma question est: est-il possible d'écrire une requête pour obtenir la ligne avec la plus grande timestamp sans la commande de la sélectionner et de limiter le nombre de lignes retournées à 1? Cela semble comme il devrait être possible, mais je pense que mes SQL-fu n'est pas à la hauteur.
OriginalL'auteur Kyle Cronin | 2008-12-24
Vous devez vous connecter pour publier un commentaire.
ou, si SQLite insiste sur le fait de traiter les sous-sélections comme jeux
Juste curieux, ne la sous-requête cause sqlite pour traiter la table deux fois, ou est-ce optimisée loin?
Il est procédé de la table à deux reprises: une fois pour trouver le max, et encore pour trouver les correspondances. Je ne suis pas sûr que vous pouvez obtenir un passe-algorithme pour cette sortie de SQL.
OriginalL'auteur SquareCog
Il existe de nombreuses façons à la peau d'un chat.
Si vous avez une Colonne d'Identité qui a une auto-incrément de la fonctionnalité, une requête plus rapide si vous retournez la dernière de record par code, en raison de l'indexation de la colonne, sauf si bien sûr vous souhaitez mettre un index sur la colonne de type timestamp.
OriginalL'auteur ADP
Je pense que j'ai répondu à cette question 5 fois dans la dernière semaine maintenant, mais je suis trop fatigué pour trouver un lien vers l'un de ceux-ci maintenant, donc, ici, il est de nouveau...
Vous êtes à la recherche fondamentalement la ligne où aucune autre ligne matchs c'est plus tard qu'il l'.
REMARQUE: Comme l'a souligné dans les commentaires, cette méthode ne sera pas effectuer aussi bien dans ce genre de situation. Il sera généralement mieux travailler (pour SQL Server au moins) dans les situations où vous voulez la dernière ligne pour chaque client (par exemple).
Cela fonctionne, mais il est génial dans son inefficacité. En supposant que 10 lignes dans la table d'origine, ce produit (et rejets), 55 lignes. Pour 100 lignes, la taille de l'ensemble que vous produisez est 5,050. Il pousse très vite. Vaut mieux faire les deux scans.
Oh, et cela ne fonctionne pas lorsque vous avez deux lignes avec la même limite de timestamp.
Votre propre solution donne exactement le même résultat si les deux lignes ont la même limite de timestamp. Comme pour l'efficacité, dans cet exemple simpliste en utilisant une sous-requête fonctionne mieux, mais pas dans le cas où vous souhaitez la dernière ligne regroupés par une autre colonne.
Tom, vous avez raison, je retire mon commentaire au sujet de votre solution ne fonctionne pas. Mais je maintiens que c'est très inefficace. Aussi loin que le groupement par un autre article, hein? Il suffit de jeter dans le "groupe x". Peut-être que je ne comprends pas le scénario? De façon générale,philisophy, j'essaie d'éviter près de cartésien des jointures.
OriginalL'auteur Tom H
vous pouvez simplement faireSELECT *, max(timestamp) à PARTIR de la tableEdit:
Comme fonction d'agrégation ne peut pas être utilisé comme cela, de sorte qu'il donne l'erreur. Je suppose que ce SquareCog avait suggéré était la meilleure chose à faire
OriginalL'auteur ABH