【问题标题】:SQL/Access 2010 - Group by Name and filtering dataSQL/Access 2010 - 按名称分组和过滤数据
【发布时间】:2018-09-16 08:04:30
【问题描述】:

我在 MS Access 2010 中有下表作为示例。我需要过滤该表,以便每个名称只有一行。

标准是日期必须是最新的,但不得迟于今天的日期(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

我的问题是在对名称进行分组时尝试过滤这些数据。

【问题讨论】:

  • 将 (Matt,08/09/2018, A) 添加到样本数据中,并相应调整预期结果。
  • 同时添加(John,04/04/2018,D)。
  • 我添加了马特。它们不会出现在结果中,因为它们需要当前日期之前的日期,因此结果不会改变。一行永远不会有相同的名称和日期,因此不会输入团队 D 中 2018 年 4 月 4 日 john 的另一行。

标签: sql ms-access filter group-by


【解决方案1】:

试试下面的查询。它使用相关子查询,并过滤掉没有最大日期的行:

SELECT *
  FROM table1 t
 WHERE t.Date = (SELECT MAX(s.date)
                     FROM table1 s
                    WHERE t.Name = s.Name
                      AND s.Date <= Date())

【讨论】:

  • 完美运行。谢谢。
【解决方案2】:

如何使用子查询来满足第一个条件(所有日期

SELECT Student, Max(Date) AS MaxDate, First(Team) AS FirstOfTeam
FROM (SELECT tbl_name.Student, Date, Team
FROM tbl_name
where Date <= Date())

GROUP BY Student;

假设您想按第一个对团队进行分组 - 因为您是在最近的日期之后,所以这无关紧要,因为我假设您不会为不同团队中的人输入相同的日期。

如果这是不正确的假设,请告诉我!

如果您想使用 DLookup 对团队名称进行排序,您可以试试这个

SELECT Student, Max(Date) AS MaxDate, First(TeamID) AS FirstOfTeam
FROM (SELECT tbl_name.Student, tbl_name.Date, DLookUp("[TEAM]","TBL_TEAM","TeamID='" & Team & "'") AS TeamID
FROM tbl_name
WHERE (((tbl_name.[Date])<=Date())))
GROUP BY Student;

【讨论】:

  • 谢谢,现在无法访问数据库,错字在哪里?
  • CURRENT_DATE() 应该是 DATE() 并将 Team 添加到 GROUP BY 并且应该很好。现在 OP 应该将字段名称从 Name 和 Date 更改为未保留的名称。 编辑... 不太好,不能在Team 上分组 :)
  • 刚刚更新了,我不确定 OP 想要与团队一起做什么,所以我现在只是使用“第一”,如果他们提供一些见解可以稍后扩展!
  • 这似乎有效,但是我的团队列来自 Access 中的查找表,它绑定到团队 ID {1,2,3,4} 而不是团队名称 {A,B,C,D所以使用 first(Team) 会产生一个数值而不是名称。知道如何改变这个吗?
  • @WillacyMe 我已经尽我所能“重新创建”,并且表格中的“团队”是一个文本框,查找字段,查询仍然显示 A/B/C/D查询,而不是数字。用于查找字段的查询是什么?
猜你喜欢
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多