我正在使用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
答案 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
);