Агрегатные функции в предложении WHERE в SQLite - PullRequest
11 голосов
/ 24 декабря 2008

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

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-фу не подходит.

Ответы [ 4 ]

17 голосов
/ 24 декабря 2008
SELECT * from foo where timestamp = (select max(timestamp) from foo)

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

SELECT * from foo where timestamp in (select max(timestamp) from foo)
4 голосов
/ 18 октября 2012

Есть много способов снять кожу с кошки.

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

SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1
1 голос
/ 13 октября 2010

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

SELECT *, max (метка времени) ОТ таблицы

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

SELECT * FROM table WHERE timestamp = (select max(timestamp) from table)
1 голос
/ 24 декабря 2008

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

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

По сути, вы ищете строку, в которой нет совпадений с другой строкой, более поздней, чем эта.

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

...