MySQL-从表中选择最新行

时间:2020-04-07 03:16:36

标签: mysql sql

我正在使用mySQL v5.7.29 MySQL社区服务器(GPL)

在下面的列(时间戳Updated以外的所有列)上,我有一个表,在其中创建一个唯一索引以避免插入重复的值:

CREATE UNIQUE INDEX daily_unique ON daily(`Contract Date`, `Delivery`, `Product`, `Region`, `Price`)

我需要通过Updated(时间戳)选择最新记录。

我尝试了以下操作:

SELECT * FROM daily
WHERE updated = ( SELECT max(Updated) FROM daily ) 

但是,由于有多个“交付”,“产品”,“地区”,因此上述方法无效。

以下是记录的摘录:

     Contract Date    Delivery      Product Region   Price   Updated
0    2020-04-06       2020-04-01    A       B        1       2020-04-06 23:00:17
1    2020-04-06       2020-04-01    A       B        2       2020-04-07 10:30:16

我需要查询仅返回最新记录(每组交货,产品和地区都应仅返回单个合同日期和价格)。

     Contract Date    Delivery      Product Region   Price   Updated
1    2020-04-06       2020-04-01    A       B        2       2020-04-07 10:30:16

2 个答案:

答案 0 :(得分:2)

如果您使用的是MySQL 8+,则ROW_NUMBER是转到此处的方法:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Delivery, Product, Region
                                 ORDER BY Updated DESC) rn
    FROM daily
)

SELECT `Contract Date`, Delivery, Product, Region, Price, Updated
FROM cte
WHERE rn = 1;

对于每组交货/产品/区域记录,上面的行号将从1开始,从最近更新的记录开始。然后,我们查询CTE仅保留每个组的最新记录。

如果您使用的是MySQL的早期版本,这是另一种实现方法:

SELECT d1.`Contract Date`, d1.Delivery, d1.Product, d1.Region, d1.Price, d1.Updated
FROM daily d1
INNER JOIN
(
    SELECT Delivery, Product, Region, MAX(Updated) AS MaxUpdated
    FROM daily
    GROUP BY Delivery, Product, Region
) d2
    ON d1.Delivery = d2.Delivery AND
       d1.Product  = d2.Product AND
       d1.Region   = d2.Region AND
       d1.Updated  = d2.MaxUpdated;

答案 1 :(得分:1)

您还可以使用 correlated 子查询:

SELECT d.*
FROM daily d
WHERE d.updated = (SELECT MAX(d1.updated)
                   FROM daily d1 
                   WHERE d.Delivery = d1.Delivery AND
                         d.Product  = d1.Product AND
                         d.Region   = d1.Region AND
                  );
相关问题