Как получить строки с максимальной датой при группировании в MySQL?
у меня есть таблица с ценами и сроками на товар:
id
product
price
date
создать новую запись при изменении цены. И у меня есть такой стол:
id product price date
1 1 10 2014-01-01
2 1 20 2014-02-17
3 1 5 2014-03-28
4 2 25 2014-01-05
5 2 12 2014-02-08
6 2 30 2014-03-12
Я хочу получить последнюю цену для всех продуктов. Но когда я группируюсь с "продуктом", я не могу получить цену из строки с максимальной датой.
Я могу использовать MAX()
, MIN()
или COUNT()
функция в запросе, но мне нужен результат, основанный на другом значении.
Я хочу что-то подобное в финал:
product price date
1 5 2014-03-28
2 30 2014-03-12
но я не знаю как. Может быть так:
SELECT product, {price with max date}, {max date}
FROM table
GROUP BY product
4 ответов
кроме того, вы можете иметь подзапрос, чтобы получить последний get для каждого продукта и присоединиться к результату в самой таблице, чтобы получить другие столбцы.
SELECT a.*
FROM tableName a
INNER JOIN
(
SELECT product, MAX(date) mxdate
FROM tableName
GROUP BY product
) b ON a.product = b.product
AND a.date = b.mxdate
Я думаю, самый простой способ-это substring_index()
/group_concat()
трюк:
SELECT product,
substring_index(group_concat(price order by date desc), ',', 1) as PriceOnMaxDate
max(date)
FROM table
GROUP BY product;
еще один способ, который может быть более эффективным, чем group by
- это:
select p.*
from table t
where not exists (select 1
from table t2
where t2.product = t.product and
t2.date > t.date
);
это говорит: "Получите мне все строки из таблицы, где один и тот же продукт не имеет большей даты."Это причудливый способ сказать "Дайте мне строку с максимальной датой для каждого продукта."
обратите внимание, что есть тонкая разница: вторая форма вернет все строки, которые на максимальную дату, если есть дубликаты.
кроме того, для производительности индекс на table(product, date)
рекомендуется.
вы можете использовать подзапрос, который группирует по продукту и возвращает максимальную дату для каждого продукта, и присоединить этот подзапрос обратно к таблице products:
SELECT
p.product,
p.price,
p.date
FROM
products p INNER JOIN (
SELECT
product,
MAX(date) AS max_date
FROM
products
GROUP BY
product) m
ON p.product = m.product AND p.date = m.max_date
SELECT
product,
price,
date
FROM
(SELECT
product,
price,
date
FROM table_name ORDER BY date DESC) AS t1
GROUP BY product;