我在产品上有价格和日期表:
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
答案 0 :(得分:11)
或者,您可以使用子查询获取每个产品的最新获取,并将结果连接到表本身以获取其他列。
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
答案 1 :(得分:3)
我认为最简单的方法是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)
上的索引。
答案 2 :(得分:2)
您可以使用按产品分组的子查询并返回每个产品的最大日期,并将此子查询加入产品表:
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
答案 3 :(得分:0)
SELECT
product,
price,
date
FROM
(SELECT
product,
price,
date
FROM table_name ORDER BY date DESC) AS t1
GROUP BY product;