MS Access 2010按Name分组并筛选符合日期条件的数据
在Access 2010中筛选每个用户的最新有效记录
刚好碰到过类似的需求,给你两种靠谱的方法来实现——每个用户只保留最新且不晚于2018年4月6日的那一行数据。
先明确你的数据源和期望结果:
原数据表:
Name Date Team John 04/04/2018 A John 02/02/2018 B James 10/10/2018 A James 03/03/2018 C Matt 08/09/2018 D
期望筛选结果:
Name Date Team John 04/04/2018 A James 03/03/2018 C
方法一:子查询分组获取最大日期后关联
这是Access里处理这类分组筛选最常用的方式,逻辑清晰且效率不错:
SELECT t.Name, t.Date, t.Team FROM YourTableName AS t INNER JOIN ( -- 先按Name分组,找出每个用户不晚于指定日期的最大日期 SELECT Name, MAX(Date) AS MaxDate FROM YourTableName WHERE Date <= #04/06/2018# GROUP BY Name ) AS sub ON t.Name = sub.Name AND t.Date = sub.MaxDate
逻辑解释:
- 子查询
sub会先过滤掉所有晚于4月6日的记录,然后按Name分组,算出每个用户的最新有效日期MaxDate。 - 再把原表
t和这个子查询关联,匹配Name和对应的MaxDate,就能精准拿到每个用户最新那条记录的完整信息。
方法二:用子查询直接匹配每个用户的最大日期
如果你的数据量不大,这种写法更直观,不用写关联:
SELECT t1.Name, t1.Date, t1.Team FROM YourTableName AS t1 WHERE t1.Date = ( -- 针对当前行的用户,找出他不晚于指定日期的最大日期 SELECT MAX(t2.Date) FROM YourTableName AS t2 WHERE t2.Name = t1.Name AND t2.Date <= #04/06/2018# ) -- 再额外加一层过滤,确保当前行日期符合要求 AND t1.Date <= #04/06/2018#
注意事项:
- 记得把代码里的
YourTableName替换成你实际的表名。 - Access里日期常量要用
#包裹,比如#04/06/2018#,如果是其他地区日期格式(比如DD/MM/YYYY),要对应调整格式。 - 如果某个用户所有记录都晚于4月6日(比如示例里的Matt),两种方法都会自动排除他,符合你的需求。
内容的提问来源于stack exchange,提问作者WillacyMe
相关产品推荐
相关产品推荐

