Le funzioni aggregate nella clausola WHERE in SQLite
-
23-08-2019 - |
Domanda
In poche parole, ho una tabella con, tra le altre cose, una colonna per i timestamp. Voglio ottenere la riga con il più recente (cioè valore più grande) timestamp. Attualmente sto facendo questo:
SELECT * FROM table ORDER BY timestamp DESC LIMIT 1
Ma mi piacerebbe molto meglio fare qualcosa di simile:
SELECT * FROM table WHERE timestamp=max(timestamp)
Tuttavia, SQLite rifiuta questa query:
SQL error: misuse of aggregate function max()
La documentazione rel="noreferrer"> conferma questo comportamento (in fondo alla pagina):
Le funzioni aggregate possono essere utilizzati solo in un'istruzione SELECT.
La mia domanda è: è possibile scrivere una query per ottenere la riga con la più grande timestamp senza ordinare la selezionare e limitare il numero di righe restituite al 1? Questo sembra che dovrebbe essere possibile, ma credo che il mio SQL-fu non è fino al tabacco da fiuto.
Soluzione
SELECT * from foo where timestamp = (select max(timestamp) from foo)
o, se SQLite insiste sul trattamento subselect come set,
SELECT * from foo where timestamp in (select max(timestamp) from foo)
Altri suggerimenti
Ci sono molti modi per la pelle di un gatto.
Se si dispone di una colonna di identità che ha una funzionalità di auto-incremento, una query più veloce comporterebbe se si torna l'ultimo record per ID, a causa del indicizzazione della colonna, a meno che naturalmente si desidera mettere un indice sulla colonna timestamp.
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1
Credo di aver risposto a questa domanda 5 volte la scorsa settimana ora, ma sono troppo stanco per trovare un link a uno di quelli in questo momento, così qui è di nuovo ...
SELECT
*
FROM
table T1
LEFT OUTER JOIN table T2 ON
T2.timestamp > T1.timestamp
WHERE
T2.timestamp IS NULL
Stai fondamentalmente cercando la riga in cui nessun altra riga corrisponde cioè più tardi di quanto.
NOTA: Come sottolineato nei commenti, questo metodo non si esibirà anche in questo tipo di situazione. E di solito funziona meglio (per SQL Server almeno) nelle situazioni in cui si desidera l'ultima riga per ogni cliente (come esempio).
si può semplicemente fare
SELECT *, max (timestamp) FROM tabella
Modifica Come funzione di aggregazione non può essere usata come questo così dà errore. Credo che quello che SquareCog aveva suggerito era la cosa migliore da fare
SELECT * FROM table WHERE timestamp = (select max(timestamp) from table)