如何按每个name对应的最大datetime值查询获取对应value等记录
需求实现方案
以下实现默认你的数据表名为fruit_data,可根据实际表名替换。
方案1:窗口函数实现(推荐,适配MySQL8+、PostgreSQL、SQL Server等所有现代数据库)
SELECT name, value, datetime FROM ( SELECT name, value, datetime, ROW_NUMBER() OVER (PARTITION BY name ORDER BY datetime DESC) AS rn FROM fruit_data ) t WHERE rn = 1;
逻辑说明:通过PARTITION BY name按名称分组,每组内按datetime倒序排列后编号,每组编号为1的就是最大时间对应的记录,过滤后即可得到目标结果。
注意:如果同一个name存在多条完全相同的最大datetime记录,使用
ROW_NUMBER()只会随机返回其中一条,如需返回所有符合条件的记录,可将ROW_NUMBER()替换为RANK()。
方案2:关联子查询实现(兼容低版本数据库,如MySQL5.x)
SELECT t1.name, t1.value, t1.datetime FROM fruit_data t1 WHERE t1.datetime = ( SELECT MAX(datetime) FROM fruit_data t2 WHERE t2.name = t1.name );
逻辑说明:子查询先查询每个name对应的最大datetime,外层查询匹配同name且时间等于最大时间的记录即可。
方案3:分组关联实现
SELECT t1.name, t1.value, t1.datetime FROM fruit_data t1 INNER JOIN ( SELECT name, MAX(datetime) AS max_dt FROM fruit_data GROUP BY name ) t2 ON t1.name = t2.name AND t1.datetime = t2.max_dt;
内容的提问来源于stack exchange,提问作者Aleksandr
相关产品推荐
相关产品推荐

