Простой способ: ORDER BY в сочетании с LIMIT
SELECT timestamp, value, card
FROM my_table
ORDER BY timestamp DESC
LIMIT 1;
Однако LIMIT не является стандартным и, как указано в Wikipedia , Основные функции стандарта SQL не указаны явноопределить порядок сортировки по умолчанию для пустых значений. .Наконец, только одна строка возвращается, когда несколько записей имеют максимальную временную метку.
Реляционный путь:
Типичный способ сделать это - проверить, что ни одна строка не имеет более высокой временной метки, чем любая строка, которую мыretrieve.
SELECT timestamp, value, card
FROM my_table t1
WHERE NOT EXISTS (
SELECT *
FROM my_table t2
WHERE t2.timestamp > t1.timestamp
);
Это мое любимое решение, которое я использую.Недостатком является то, что наше намерение не сразу ясно, когда мы можем взглянуть на этот запрос.
Поучительный путь: MAX
Чтобы обойти это, можно использовать MAX в подзапросе вместо корреляции.
SELECT timestamp, value, card
FROM my_table
WHERE timestamp = (
SELECT MAX(timestamp)
FROM my_table
);
Но без индекса потребуется два прохода данных, тогда как предыдущий запрос может найти решение только с одним сканированием.Тем не менее, мы не должны принимать во внимание производительность при разработке запросов без необходимости, поскольку мы можем ожидать, что оптимизаторы со временем улучшатся.Однако этот конкретный тип запросов довольно часто используется.
Поговорим о: оконные функции
Я не рекомендую делать это, но, возможно, вы можете произвести хорошее впечатление на своего босса или что-то еще;-)
SELECT DISTINCT
first_value(timestamp) OVER w,
first_value(value) OVER w,
first_value(card) OVER w
FROM my_table
WINDOW w AS (ORDER BY timestamp DESC);
На самом деле это имеет то преимущество, что показывает, что простой запрос может быть выражен различными способами (есть несколько других, которые я могу придумать), и что выбираем ту или иную формудолжно быть сделано в соответствии с несколькими критериями, такими как:
- переносимость (реляционные / инструктивные способы)
- эффективность (реляционные пути)
- выразительность (простой / инструктивный способ)