MS Access查询:获取各Item及XorZ的最新数据求助
解决每个Item+XorZ组合的最新数据查询问题
嗨,刚接触SQL查询完全不用客气~你的需求是要拿到每个Item和XorZ组合下最新(最大日期)那条记录的日期,以及对应的值对吧?之前用GROUP BY的方式可能会踩坑:虽然能算出MAX(Date),但没法直接关联到该日期对应的具体值,因为GROUP BY后的非聚合字段不一定来自你要的那条最新记录。
给你两种靠谱的解决方案,根据你的数据库版本选就行:
方法一:用窗口函数(推荐,适合主流数据库)
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server、Oracle等),用ROW_NUMBER()是最直观的方式:
SELECT Item, Date, XorZ, Value -- 把Value替换成你需要提取的额外字段 FROM ( SELECT Item, Date, XorZ, Value, -- 按Item和XorZ分组,每组内按日期倒序排,最新的记录标记为1 ROW_NUMBER() OVER (PARTITION BY Item, XorZ ORDER BY Date DESC) AS rn FROM MyTable ) t WHERE rn = 1;
逻辑说明:
PARTITION BY Item, XorZ:把数据按「Item+XorZ」的组合拆分成独立小组ORDER BY Date DESC:每个小组内按日期从新到旧排序rn = 1:只保留每个小组里排第一的那条,也就是最新的记录
方法二:关联子查询(适合不支持窗口函数的老版本数据库)
如果是MySQL 5.x这类不支持窗口函数的环境,可以先算出每个组合的最大日期,再关联原表匹配对应记录:
SELECT t1.Item, t1.Date, t1.XorZ, t1.Value FROM MyTable t1 INNER JOIN ( -- 先拿到每个Item+XorZ的最大日期 SELECT Item, XorZ, MAX(Date) AS MaxDate FROM MyTable GROUP BY Item, XorZ ) t2 ON t1.Item = t2.Item AND t1.XorZ = t2.XorZ AND t1.Date = t2.MaxDate;
小提醒:
如果同一个「Item+XorZ」组合下,有多条记录的日期都是最大日期,两种方法的处理有区别:
- 用
ROW_NUMBER()会随机返回其中一条;如果想保留所有同日期的最新记录,把ROW_NUMBER()换成RANK()或DENSE_RANK()就行 - 关联子查询会返回所有符合最大日期的记录,按需选择就好
内容的提问来源于stack exchange,提问作者MRiley
相关产品推荐
相关产品推荐

