Как получить последнюю по дате запись (SQLite)?

Рейтинг: 0Ответов: 1Опубликовано: 26.01.2023

У меня есть таблица price (id, link, name, cost, date). В столбце name содержатся имена товаров, в столбце cost - цена на соответствующий товар. Эти цены с некоторой периодичностью добавляются в таблицу. Мне необходимо вытащить из таблицы последнюю запись конкретного товара по дате. Как я это могу сделать?

Ответы

▲ 3Принят
SELECT *
FROM price
WHERE name = 'product_name'
ORDER BY date DESC
LIMIT 1;

запрос сначала выбирает все записи с именем товара product_name, затем сортирует их по дате в порядке убывания и возвращ. только одну посл. запись с помощью оператора LIMIT 1.

Еще вариант:

SELECT * FROM price p1 WHERE date = (SELECT MAX(date) FROM price p2 WHERE p1.name=p2.name AND p1.name='product_name')

или так:

SELECT *
FROM (SELECT * FROM price WHERE name = 'product_name' ORDER BY date DESC) as temp_table
GROUP BY name

Еще одно решение может быть функции для вашей СУБД, например ROW_NUMBER() в SQL, DENSE_RANK() в Oracle или RANK() в MySQL.

WITH temp_table AS (
    SELECT id, link, name, cost, date, ROW_NUMBER() OVER (PARTITION BY name ORDER BY date DESC) as rn
    FROM price
)
SELECT * FROM temp_table WHERE name = 'product_name' and rn = 1;

Предложенный мной ранее запрос с использованием оператора GROUP BY может возвращать неожиданный результат, если таблица price содержит несколько записей с одинаковым именем товара и датой, так как в этом случае неопределенно, какую из этих записей вернет запрос. Есть несколько других способов решить эту задачу. Один из них - это использование сортировки и оператора LIMIT 1 в запросе. Например:

SELECT id, link, name, cost, date
FROM price
WHERE name = 'product_name'
ORDER BY date DESC
LIMIT 1;

Этот запрос выбирает все записи с именем товара 'product_name', сортирует их по дате в порядке убывания и возвращает только одну последнюю запись с помощью оператора LIMIT 1.

Другой способ - подзапрос с макс. датой:

SELECT id, link, name, cost, date