如何在MySQL中进行分组时获取具有最大日期的行?

时间:2014-06-16 10:30:42

标签: mysql sql max

我在产品上有价格和日期表:

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 个答案:

答案 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;