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

Max*_*xKu 8 mysql sql max

我有一张价格和产品日期表:

id
product
price
date
Run Code Online (Sandbox Code Playgroud)

我在价格变化时创造了一个新记录.我有一张这样的桌子:

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
Run Code Online (Sandbox Code Playgroud)

我想得到所有产品的最后价格.但是当我与"产品"分组时,我无法从最大日期的行中获得价格.

我可以使用MAX(),MIN()COUNT()在请求功能,但我需要根据其他价值的结果.

我最终想要这样的东西:

product price date
1        5    2014-03-28
2       30    2014-03-12
Run Code Online (Sandbox Code Playgroud)

但我不知道怎么做.可能是这样的:

SELECT product, {price with max date}, {max date}
FROM table
GROUP BY product
Run Code Online (Sandbox Code Playgroud)

Joh*_*Woo 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
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 7

我认为最简单的方法是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;
Run Code Online (Sandbox Code Playgroud)

另一种可能比 a 更有效的方法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
                 );
Run Code Online (Sandbox Code Playgroud)

这表示:“从表中获取相同产品没有更大日期的所有行。” 这是说“给我每个产品的最大日期的行”的一种奇特方式。

请注意,有一个细微的区别:如果有重复,第二个表单将返回最大日期的所有行。

此外,为了提高性能,table(product, date)建议使用索引。