Frage

Einfach gesagt, ich habe eine Tabelle mit, unter anderem, eine Spalte für Zeitstempel. Ich mag die Zeile mit dem neuesten (d größten Wert) Zeitstempel erhalten. Derzeit wird diese ich tue:

SELECT * FROM table ORDER BY timestamp DESC LIMIT 1

Aber ich würde viel lieber etwas tun, wie folgt aus:

SELECT * FROM table WHERE timestamp=max(timestamp)

Allerdings SQLite lehnt diese Abfrage:

SQL error: misuse of aggregate function max()

Die Dokumentation dieses Verhalten (unten auf der Seite) bestätigt:

  

Aggregatfunktionen können nur in einer SELECT-Anweisung verwendet werden.

Meine Frage ist: ist es möglich, eine Abfrage zu schreiben, die Zeile mit dem größten Zeitmarke zu erhalten, ohne die Auswahl Bestellung und die Anzahl der zurückgegebenen Zeilen 1 zu begrenzen? Dies scheint, wie es möglich sein soll, aber ich denke, mein SQL-fu ist nicht bis zu Schnupftabak.

War es hilfreich?

Lösung

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

oder, wenn SQLite beharrt auf Subselects als Sätze zu behandeln,

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

Andere Tipps

Es gibt viele Möglichkeiten, die Haut eine Katze.

Wenn Sie eine Identity-Spalte haben, die eine Autoinkrement-Funktionalität hat, eine schnellere Abfrage würde, wenn Sie den letzten Datensatz von ID zurückzukehren, aufgrund der Indizierung der Spalte, außer natürlich, Sie wollen auf der einen Index setzen Timestamp-Spalte.

SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

Ich glaube, ich habe diese Frage 5 mal in der vergangenen Woche nun beantwortet, aber ich bin zu müde, um einen Link zu einem von denen im Augenblick zu finden, so ist es hier wieder ...

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

Sie suchen im Grunde für die Zeile, wenn keine andere Zeile übereinstimmt, dass später, als es ist.

Hinweis: Wie in den Kommentaren darauf hingewiesen, diese Methode nicht auch in einer solchen Situation führen. Es wird in der Regel besser funktionieren (für SQL Server zumindest) in Situationen, in denen Sie die letzte Zeile für jeden Kunden (als Beispiel) wollen.

Sie können einfach tun

SELECT *, max (Zeitstempel) FROM Tabelle

Edit: Als Aggregatfunktion kann so nicht so verwendet werden, gibt es Fehler. Ich denke, was SquareCog vorgeschlagen hatte, war das Beste, was zu tun

SELECT * FROM table WHERE timestamp = (select max(timestamp) from table)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top