Ответ 1
SELECT * from foo where timestamp = (select max(timestamp) from foo)
или, если SQLite настаивает на обработке подзапросов в качестве наборов,
SELECT * from foo where timestamp in (select max(timestamp) from foo)
Проще говоря, у меня есть стол, среди прочего, столбец для временных меток. Я хочу получить строку с самой последней (то есть наибольшей) меткой времени. В настоящее время я делаю это:
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 не до табака.
SELECT * from foo where timestamp = (select max(timestamp) from foo)
или, если SQLite настаивает на обработке подзапросов в качестве наборов,
SELECT * from foo where timestamp in (select max(timestamp) from foo)
Существует много способов скинуть кошку.
Если у вас есть столбец Identity, который имеет функцию автоматического увеличения, более быстрый запрос может возникнуть, если вы вернете последнюю запись по идентификатору из-за индексации столбца, если, конечно, вы не хотите указывать индекс на столбец времени.
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1
Я думаю, что я ответил на этот вопрос 5 раз за последнюю неделю, но я слишком устал, чтобы найти ссылку на одну из них прямо сейчас, так что вот она снова...
SELECT
*
FROM
table T1
LEFT OUTER JOIN table T2 ON
T2.timestamp > T1.timestamp
WHERE
T2.timestamp IS NULL
В основном вы ищете строку, в которой нет другой строки, которая позже, чем она.
ПРИМЕЧАНИЕ. Как отмечалось в комментариях, этот метод не будет работать и в такой ситуации. Как правило, он работает лучше (для SQL Server по крайней мере) в ситуациях, когда требуется последняя строка для каждого клиента (в качестве примера).
вы можете просто сделать
SELECT *, max (метка времени) FROM table
Edit: Поскольку агрегатная функция не может использоваться так, чтобы она приводила к ошибке. Я предполагаю, что предложили SquareCog - лучшее, что можно сделать
SELECT * FROM table WHERE timestamp = (select max(timestamp) from table)