Las funciones de agregado en cláusula WHERE en SQLite
-
23-08-2019 - |
Pregunta
En pocas palabras, tengo una tabla con, entre otras cosas, una columna de marcas de tiempo. Quiero conseguir la fila con el más reciente marca de tiempo (es decir, mayor valor). Actualmente estoy haciendo esto:
SELECT * FROM table ORDER BY timestamp DESC LIMIT 1
Pero yo preferiría haría algo como esto:
SELECT * FROM table WHERE timestamp=max(timestamp)
Sin embargo, SQLite rechaza esta consulta:
SQL error: misuse of aggregate function max()
La documentación rel="noreferrer"> confirma este comportamiento (parte inferior de la página):
Las funciones de agregación sólo pueden ser utilizados en una instrucción SELECT.
Mi pregunta es: ¿es posible escribir una consulta para obtener la fila con la mayor marca de tiempo sin necesidad de ordenar el selecto y limitar el número de filas devueltas a 1? Esta parece que debería ser posible, pero supongo que mi SQL-fu no es hasta el tabaco.
Solución
SELECT * from foo where timestamp = (select max(timestamp) from foo)
o, si SQLite insiste en tratar subselects como conjuntos,
SELECT * from foo where timestamp in (select max(timestamp) from foo)
Otros consejos
Hay muchas maneras de pelar un gato.
Si usted tiene una columna de identidad que tiene una funcionalidad de incremento automático, una consulta más rápida resultaría si devuelve el último registro por ID, debido a la indexación de la columna, a menos que, por supuesto, usted desea poner un índice en el columna de marca de tiempo.
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1
Creo que he respondido a esta pregunta 5 veces en la semana pasada ahora, pero estoy demasiado cansado para encontrar un enlace a uno de esos en este momento, así que aquí está de nuevo ...
SELECT
*
FROM
table T1
LEFT OUTER JOIN table T2 ON
T2.timestamp > T1.timestamp
WHERE
T2.timestamp IS NULL
Básicamente, se está buscando la fila donde ninguna otra fila coincide con que es posterior a la misma.
NOTA: Como se ha señalado en los comentarios, este método no funcionará tan bien en este tipo de situación. Por lo general, trabajar mejor (para SQL Server al menos) en situaciones en las que desee la última fila para cada cliente (como ejemplo).
simplemente puede hacer
SELECT *, máx (fecha y hora) de la tabla
Editar Como función de agregado no puede ser utilizado como esto por lo que da error. Creo que lo SquareCog había sugerido fue el mejor que puede hacer
SELECT * FROM table WHERE timestamp = (select max(timestamp) from table)