MS Access - 根据 MA​​X 字段进行分组查询

MS Access - 根据 MA​​X 字段进行分组查询

我正在尝试构建一个获取以下数据的 SQL 查询:

+-------------+--------+---------+---------+--------+
| Primary Key |   ID   | Version |  Class  | Fruit? |
+-------------+--------+---------+---------+--------+
|           1 | Banana |       1 | NORTH   | Yes    |
|           2 | Onion  |       1 | WEST    | No     |
|           3 | Orange |       1 | NA      | Yes    |
|           4 | Orange |       2 | PACIFIC | Yes    |
|           5 | Banana |       2 | EUR     | Yes    |
|           6 | Celery |       1 | EUR     | No     |
|           7 | Celery |       3 | SOUTH   | No     |
|           8 | Celery |       4 | SOUTH   | No     |
|           9 | Pepper |       1 | N-PAC   | No     |
|          10 | Pepper |       2 | N-PAX   | No     |
+-------------+--------+---------+---------+--------+

Fruit并返回最新版本的ID和其对应的数据,其中检查的标准。

需要一个 SQL 字符串来返回 Max 版本的 ID 和类,其中Fruit = No

结果:

+--------+-------+
|   ID   | Class |
+--------+-------+
| Onion  | NORTH |
| Celery | SOUTH |
| Pepper | N-PAX |
+--------+-------+

我只需要返回 ID 及其类以存储在 MS Access 列表框中。

我设法在编辑器中构建了一个 Group By / Max 查询,并且只能够获取要返回分组的 ID,但是相应的数据与最大版本无关。

感谢您的帮助和专业知识。

答案1

有多种方法可以实现这一点。

以下所有示例都假设您的表已命名table1,并且您的字段为id、、classversionfruit不是fruit?) - 请根据需要更改这些以适合您的数据。

笔记:以下示例假设您的fruit领域是文本领域。如果你的fruit领域实际上是布尔值(是/否)'No'字段,然后删除以下示例中的单引号。


使用连接子查询:

select u.id, u.class
from table1 u inner join
(
    select t.id, max(t.version) as mv
    from table1 t
    where t.fruit = 'No'
    group by t.id
) v on u.id = v.id and u.version = v.mv

version在这里,子查询为每个id记录选择最大的一个,其中和然后将其连接到完整的数据集以返回每个和fruit = 'No'所需的字段。idversion


使用相关子查询:

select t.id, t.class
from table1 t
where t.fruit = 'No' and not exists
(select 1 from table1 u where u.id = t.id and u.fruit = 'No' and u.version > t.version)

这里,选择完全在WHERE子句中执行,对于每个记录,测试集合中是否存在另一个具有相同id和更大的记录version,如果是,则不返回该记录。


使用LEFT JOIN不平等的连接标准:

select t.id, t.class
from table1 t left join table1 u on t.id = u.id and t.version < u.version
where t.fruit = 'No' and u.id is null

此示例只能在 SQL 视图中的 MS Access 中表示,因为 MS Access 查询设计器无法显示具有相同连接条件的连接(即一个字段等于另一个字段)。

此示例的操作与相关子查询类似,但选择是由连接执行的,而不是在子句内执行的WHERE


最后,请注意您给出的示例结果是不正确的:的class最大值versionid = 'Onion'应该是WEST,而不是NORTH

相关内容