Совокупные функции в выражении WHERE в SQLite

Проще говоря, у меня есть стол, среди прочего, столбец для временных меток. Я хочу получить строку с самой последней (то есть наибольшей) меткой времени. В настоящее время я делаю это:

SELECT * FROM table ORDER BY timestamp DESC LIMIT 1

Но я бы скорее сделал что-то вроде этого:

SELECT * FROM table WHERE timestamp=max(timestamp)

Однако SQLite отклоняет этот запрос:

SQL error: misuse of aggregate function max()

Документация подтверждает это поведение (внизу страницы):

Агрегатные функции могут использоваться только в инструкции SELECT.

Мой вопрос: возможно ли написать запрос, чтобы получить строку с наибольшей меткой времени, не заказывая выбор и ограничение числа возвращенных строк на 1? Это похоже на то, что это должно быть возможно, но я полагаю, что мой SQL-fu не до табака.

Ответ 1

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

или, если SQLite настаивает на обработке подзапросов в качестве наборов,

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

Ответ 2

Существует много способов скинуть кошку.

Если у вас есть столбец Identity, который имеет функцию автоматического увеличения, более быстрый запрос может возникнуть, если вы вернете последнюю запись по идентификатору из-за индексации столбца, если, конечно, вы не хотите указывать индекс на столбец времени.

SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

Ответ 3

Я думаю, что я ответил на этот вопрос 5 раз за последнюю неделю, но я слишком устал, чтобы найти ссылку на одну из них прямо сейчас, так что вот она снова...

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

В основном вы ищете строку, в которой нет другой строки, которая позже, чем она.

ПРИМЕЧАНИЕ. Как отмечалось в комментариях, этот метод не будет работать и в такой ситуации. Как правило, он работает лучше (для SQL Server по крайней мере) в ситуациях, когда требуется последняя строка для каждого клиента (в качестве примера).

Ответ 4

вы можете просто сделать

SELECT *, max (метка времени) FROM table

Edit: Поскольку агрегатная функция не может использоваться так, чтобы она приводила к ошибке. Я предполагаю, что предложили SquareCog - лучшее, что можно сделать

SELECT * FROM table WHERE timestamp = (select max(timestamp) from table)