本文介绍如何使用 Access 中的最高值查询来查找一组记录中的最近或最早日期。 可以使用此类查询返回的信息来回答各种业务问题,例如客户上次下订单时。
您要做什么?
了解最高值查询如何处理日期
需要查找表或记录组中包含最晚或最早日期的记录时,请使用最高值查询。 然后,可以使用数据回答多种类型的业务问题,例如:
-
员工上次销售是什么时候? 答案可帮助你确定效率最高或工作效率最低的员工。
-
客户上次下订单是什么时候? 如果客户在给定的时间段内未下订单,你可能希望将客户移动到非活动列表。
-
谁有下一个生日或下一个 n 个生日?
用于创建和使用最高值查询的规则
通过首先创建选择查询来创建最高值查询。 根据所需的结果,可以向查询应用排序顺序,或者将查询转换为总计查询。 如果转换查询,则使用聚合函数(如 Max 或 Min )返回最高或最低值,或使用 First 或 Last 返回最早或最晚的日期。 仅当需要查找属于一组组或类别的数据时,才使用总计查询和聚合函数。 例如,假设你需要查找公司运营的每个城市的给定日期的销售数字。 在这种情况下,城市将成为类别 (你需要查找每个城市) 的数据,因此使用总计查询。
继续操作时,请记住,无论查询类型如何,查询都必须使用包含描述性数据的字段(如客户姓名),以及包含要查找的日期值的字段。 此外,日期值必须位于设置为日期/时间数据类型的字段中。 如果尝试针对短文本字段中的日期值运行这些查询,本文介绍的查询会失败。 此外,如果要使用总计查询,数据字段必须包含类别信息,例如城市或国家/地区字段。
在顶部值查询和筛选器之间进行选择
若要确定是应创建 top 值查询还是应用筛选器,请选择以下选项之一:
-
如果要返回字段中具有最近或最新日期的记录,并且不知道确切的日期值,或者它们不重要,请创建一个 top 值查询。
-
如果要返回日期匹配、早于或晚于特定日期的所有记录,请使用筛选器。 例如,若要查看 4 月至 7 月之间的销售日期,请应用筛选器。 有关筛选器的完整讨论超出了本主题的范围。
有关创建和使用筛选器的详细信息,请参阅 应用筛选器以查看 Access 数据库中的选定记录一文。
查找最近或最早的日期
本节中的步骤说明如何创建使用排序顺序的基本顶级值查询,以及使用表达式和其他条件的更高级查询。 第一部分演示了创建最高值查询的基本步骤,第二部分介绍如何通过添加条件查找接下来的几个员工生日。 这些步骤使用以下示例表中的数据。
姓氏 |
名字 |
地址 |
城市 |
国家/地区 |
出生日期 |
雇用日期 |
---|---|---|---|---|---|---|
刘鹏 |
Josh |
1 Main St. |
New York |
USA |
1968 年 2 月 5 日 |
1994 年 6 月 10 日 |
Heloo |
瓦利德 |
52 1st St. |
Boston |
USA |
1957 年 5 月 22 日 |
1996 年 11 月 22 日 |
潘杰 |
Guido |
3122 75th Ave. S.W. |
Seattle |
USA |
1960 年 11 月 11 日 |
2000 年 3 月 11 日 |
百吉饼 |
让·菲利普 |
1 Contoso Blvd. |
London |
英国 |
1964 年 3 月 22 日 |
1998 年 6 月 22 日 |
价格 |
朱利安 |
Calle Smith 2 |
墨西哥城 |
墨西哥 |
05-Jun-1972 |
2002 年 1 月 5 日 |
休斯 |
克莉 丝 汀 |
3122 75th St. S. |
Seattle |
USA |
1970 年 1 月 23 日 |
1999 年 4 月 23 日 |
莱利 |
史蒂夫 |
67 Big St. |
Tampa |
USA |
1964 年 4 月 14 日 |
2004 年 10 月 14 日 |
Birkby |
Dana |
2 鼻子 Pkwy |
珠海 |
USA |
1959 年 10 月 29 日 |
1997 年 3 月 29 日 |
如果需要,可以手动将此示例数据输入新表中,也可以将此示例表复制到电子表格程序(如 Microsoft Excel),然后使用 Access 将生成的工作表导入表中。
创建基本顶部值查询
-
在“创建”选项卡上的“查询”组中,单击“查询设计”。
-
在对话框中,单击要在查询中使用的表,单击“ 添加 ”将表置于设计器的上部,然后单击“ 关闭”。
-或者-
双击该表,然后单击“ 关闭”。
如果使用上一部分列出的示例数据,请将 Employees 表添加到查询。
-
将要在查询中使用的字段添加到设计网格。 可以双击每个字段,或将每个字段拖放到 “字段 ”行的空白单元格上。
如果使用示例表,请添加“名字”、“姓氏”和“出生日期”字段。
-
在包含“出生日期”字段 (顶部或底部值的字段中,如果使用示例表) ,请单击“ 排序” 行并选择 “升序 ”或“ 降序”。
降序排序顺序返回最近的日期,升序排序顺序返回最早的日期。
重要: 必须仅在包含日期的字段的 “排序” 行中设置值。 如果为另一个字段指定排序顺序,查询不会返回所需的结果。
-
在“ 查询设计 ”选项卡上的“ 查询设置” 组中,单击“ 所有 ”旁边的向下箭头 (“ 热门值” 列表) ,然后输入要查看的记录数,或从列表中选择一个选项。
-
单击“ 运行 运行查询并在数据表视图中显示结果。
-
保存查询并使其保持打开状态,以便在后续步骤中使用。
可以看到,这种类型的顶级值查询可以回答基本问题,例如谁是公司中最老或最年轻的人。 后续步骤说明如何使用表达式和其他条件为查询增加功能和灵活性。 下一步中显示的条件返回接下来的三个员工生日。
向查询添加条件
注意: 这些步骤假定你将使用上一部分中所述的查询。
-
将前面步骤中创建的查询切换到“设计”视图。
-
在查询设计网格中,在“出生日期”列右侧的列中,复制并粘贴或键入以下表达式: Expr1: DatePart (“m”,[出生日期]) 。 然后单击“ 运行”。
DatePart 函数提取“出生日期”字段的月份部分。
-
切换到“设计”视图。
-
在第一个表达式的右侧,粘贴或键入此表达式: Expr2: DatePart (“d”,[出生日期]) 。 然后单击“ 运行”。
在这种情况下, DatePart 函数提取“出生日期”字段的日期部分。
-
切换到“设计”视图。
-
清除刚输入的两个表达式的 “显示 ”行中的复选框,单击每个表达式的 “排序” 行,然后选择“ 升序”。
-
单击“运行”。
-
(可选)可以指定条件来限制查询的范围。 指定条件时,查询仅对满足条件的记录进行排序,并从排序列表中标识顶部或底部字段值。
若要继续使用示例数据,请切换到“设计”视图。 然后,在“出生日期”列的“条件”行中,键入以下表达式:
Month ([Birth Date]) > Month (Date () ) or Month ([Birth Date]) = Month (Date () ) and day ([Birth Date]) >Day (Date () )
此表达式执行以下操作: Month ([Birth Date]) > Month (Date () ) 部分检查每个员工的出生日期,以查看是否属于未来月份,如果为 true,则包括查询中的这些记录。 表达式的 Month ([Birth Date]) = Month (Date () ) and Day ([出生日期]) >Day (Date () ) 部分检查当前月份发生的出生日期,以查看生日是否位于当前日期或之后。 如果该条件为 true,则函数在查询中包括这些记录。 总结一下:此表达式忽略生日介于 1 月 1 日和运行查询的日期之间的任何记录。
若要查看查询条件表达式的更多示例,请参阅 查询条件示例一文。
-
在“ 查询设计 ”选项卡上的“ 查询设置” 组中,单击“ 所有 ”旁边的向下箭头 (“ 热门值” 列表) ,然后输入要查看的记录数,或从列表中选择一个选项。
若要查看接下来的三个生日,请键入 3。
-
单击“ 运行 运行查询并在数据表视图中显示结果。
如果看到超过指定的记录数
如果数据包含多个共享一个日期值的记录,则排名靠前的值查询可能会返回比指定更多的数据。 例如,可以设计一个顶值查询来检索三个员工记录,但查询返回四条记录,因为“Wilson”和“Edwards”共享生日,如下表所示。
LastName |
BirthDate |
---|---|
Berka |
9/26/1968 |
杰克逊 |
10/2/1970 |
爱德华兹 |
10/15/1965 |
威尔逊 |
10/15/1969 |
如果看到的记录数少于指定的记录数
假设你设计了一个查询以返回字段中的前五条或倒数五条记录,但该查询只返回三条记录。 通常,可以通过在设计视图中打开查询并查看设计网格中列的 “条件” 行来解决此类问题。
有关条件的详细信息,请参阅 查询条件的示例一文。
如果看到重复记录
如果 top 值查询返回重复项,则基础表包含重复记录,或记录显示为重复项,因为查询不包括可以区分记录的字段。 例如,下表显示了返回最近发货的五个订单的查询的结果,以及处理事务的销售人员的姓名。
ShippedDate |
销售人员 |
---|---|
11/12/2004 |
Freitag |
11/12/2004 |
卡亨 |
10/12/2004 |
德尔加多 |
10/12/2004 |
德尔加多 |
10/12/2004 |
Freitag |
第三条和第四条记录似乎是重复的,但销售人员德尔加多可能处理了同一天发货的两个不同的订单。
根据你的要求,你可以执行以下两项操作之一,以避免返回重复记录。 可以更改查询的设计以添加有助于区分记录的字段,例如 OrderID 和 CustomerID 字段。 或者,如果只看到一个重复记录,则可以通过将查询的 “唯一值 属性”设置为“ 是”来仅显示非重复记录。 若要设置此属性,请在查询设计视图中右键单击查询设计器上半部分空白区域中的任意位置,然后单击快捷菜单上的“ 属性 ”。 在查询的属性表中,找到 “唯一值” 属性并将其设置为 “是”。
有关处理重复记录的详细信息,请参阅使用 查询查找重复记录一文。
查找类别或组中记录的最晚或最早日期
使用总计查询查找属于组或类别的记录的最早或最晚日期。 总计查询是一种选择查询,它使用聚合函数(如 Min、 Max、 Sum、 First 和 Last )来计算给定字段的值。
本部分中的步骤假定你运行事件管理业务 - 你负责大型功能的过渡、照明、餐饮和其他方面。 此外,你管理的事件分为多个类别,例如产品发布会、街头交易会和音乐会。 本节中的步骤说明如何回答一个常见问题:下一个事件何时按类别排列? 换句话说,何时是下一个产品发布,下一场音乐会,等等。
继续操作时,请记住以下事项:默认情况下,在此处创建的总计查询类型只能包含包含组或类别数据的字段以及包含日期的字段。 不能包括描述类别中项的其他字段,例如客户或供应商名称。 但是,可以创建第二个查询,将总计查询与包含描述数据的字段组合在一起。 本部分后面的步骤说明如何执行该任务。
本部分中的步骤假定使用以下三个表:
事件类型表
TypeID |
事件类型 |
---|---|
1 |
产品发布 |
2 |
公司职能 |
3 |
专用函数 |
4 |
筹款人 |
5 |
贸易展 |
6 |
演讲 |
7 |
音乐会 |
8 |
展览 |
9 |
街头交易会 |
“客户”表
客户 ID |
公司 |
联系人 |
---|---|---|
1 |
康拓工程有限公司 图形 |
乔纳森·哈斯 |
2 |
Tailspin Toys |
艾伦·亚当斯 |
3 |
Fabrikam |
卡罗尔·菲利普斯 |
4 |
Wingtip Toys |
Lucio Iallo |
5 |
A. Datum |
曼达尔·萨曼特 |
6 |
嘉元实业 |
布赖恩·伯克 |
7 |
设计学院 |
贾卡·斯特尔 |
8 |
School of Fine Art |
Milena Duomanova |
事件表
事件 ID |
事件类型 |
客户 |
事件日期 |
价格 |
---|---|---|---|---|
1 |
产品发布 |
康拓工程有限公司 |
4/14/2003 |
$10,000 |
2 |
公司职能 |
Tailspin Toys |
4/21/2003 |
¥80,000 |
3 |
贸易展 |
Tailspin Toys |
5/1/2003 |
$25,000 |
4 |
展览 |
Graphic Design Institute |
5/13/2003 |
¥45,000 |
5 |
贸易展 |
康拓工程有限公司 |
5/14/2003 |
$55,000 |
6 |
音乐会 |
School of Fine Art |
5/23/2003 |
¥120,000 |
7 |
产品发布 |
A. Datum |
6/1/2003 |
¥150,000 |
8 |
产品发布 |
Wingtip Toys |
6/18/2003 |
¥210,000 |
9 |
筹款人 |
嘉元实业 |
6/22/2003 |
$1,300 |
10 |
演讲 |
Graphic Design Institute |
6/25/2003 |
$2,450 |
11 |
演讲 |
康拓工程有限公司 |
7/4/2003 |
$3,800 |
1.2 |
街头交易会 |
Graphic Design Institute |
7/4/2003 |
¥55,000 |
注意: 本部分中的步骤假定“客户”和“事件类型”表位于“事件”表的一对多关系的“一”端。 在这种情况下,“事件”表共享 CustomerID 和 TypeID 字段。 如果没有这些关系,下一部分所述的总计查询将无法正常工作。
如何将此数据添加到数据库?
若要将这些示例表添加到数据库,可以将数据复制到 Excel,然后导入数据,但有一些例外:
-
将“事件类型”和“客户”表复制到 Excel 时,请勿复制 TypeID 和 CustomerID 列。 导入工作表时,Access 将添加主键值;这样可以节省一些时间。
-
导入表后,必须在“设计”视图中打开“事件”表,并将“事件类型”和“客户”列转换为查阅字段。 为此,请单击每个字段的 “数据类型” 列,然后单击“ 查找向导”。
作为创建查找字段的一部分, Access 将“事件类型”和“客户”列中的文本值替换为源表中的数值。
有关创建和使用查找字段的详细信息,请参阅 创建或删除多值字段一文。 本文介绍如何创建一种查找字段类型,以便为给定字段选择多个值,并介绍如何创建查阅列表。
创建总计查询
-
在“创建”选项卡上的“查询”组中,单击“查询设计”。
-
双击要使用的表。 每个表都显示在查询设计器的上半部分。
如果使用上面列出的示例表,请添加“事件”和“事件类型”表。
-
双击要在查询中使用的表字段。 确保此时仅将组或类别字段和值字段添加到查询。
如果使用前面三个表中列出的示例数据,则可以从“事件类型”表中添加“事件类型”字段,或从“事件”表中添加“事件日期”字段。
-
(可选)可以指定限制查询范围的条件。 仅对符合条件的记录进行排序,并在此排序列表中标识顶部和底部字段值。
例如,如果要返回“专用函数”类别中的事件,请在“事件类型”列的“条件”行中键入此表达式: <>“Private Function”。
若要查看查询条件表达式的更多示例,请参阅 查询条件示例一文。
-
执行以下操作,将查询转换为总计查询:
在“ 查询设计 ”选项卡上的“ 显示/隐藏 ”组中,单击“ 总计”。
“总计”行显示在设计网格中。
-
确保每个组或类别字段的 “汇总 ”行设置为 “分组依据”,然后将值字段的 “总计 ”行设置为“最大值”或“最小值” () 为 “最大值 ”或“ 最小值”。
Max 返回数值字段中的最大值,以及日期/时间字段中的最近日期或时间值。 Min 返回数值字段中的最小值,在日期/时间字段中返回最早的日期或时间值。
-
在“ 查询设计 ”选项卡上的“ 查询设置” 组中,单击“ 所有 ”旁边的向下箭头 (“ 热门值” 列表) ,然后输入要查看的记录数,或从列表中选择一个选项。
在这种情况下,选择“ 全部”,然后单击“ 运行 ”,在“数据表”视图中显示结果。
注意: 根据在步骤 6 中选择的函数, Access 将查询中值字段的名称更改为 MaxOfFieldName 或 MinOfFieldName。 如果使用示例表, Access 重命名字段 MaxOfEvent Date 或 MinOfEvent Date。
-
保存查询并转到后续步骤。
查询结果不显示产品名称或有关产品的任何其他信息。 若要查看其他数据,需要创建第二个查询来合并刚刚创建的查询。 后续步骤说明如何执行此操作。
创建第二个查询以添加更多数据
-
在“创建”选项卡上的“查询”组中,单击“查询设计”。
-
单击“ 查询 ”选项卡,然后双击在上一部分创建的总计查询。
-
单击“ 表 ”选项卡,添加总计查询中使用的表,并添加包含其他相关数据的任何表。 如果使用上述三个示例表,请将“事件类型”、“事件”和“客户”表添加到新查询。
-
将总计查询中的字段联接到父表中的相应字段。 为此,请将总计查询中的每个字段拖动到表中的相应字段。
如果使用三个表中的示例数据,请将总计查询中的“事件类型”列拖到“事件类型”表中的“事件类型”字段。 然后,将总计查询中的 MaxOfEvent Date 列拖动到 Events 表中的“事件日期”字段。 通过创建这些联接,新的选择查询可以将总计查询中的数据与其他表中的数据合并在一起。
-
从查询中的其他表中添加其他描述性字段。
如果使用三个表中的示例数据,则可以从“客户”表中添加“公司”和“联系人”字段。
-
(可选)为一个或多个列指定排序顺序。 例如,若要按字母顺序列出类别,请将“事件类型”列的“排序”行设置为“升序”。
-
在“ 查询设计 ”选项卡上的“ 结果 ”组中,单击“ 运行”。
查询的结果显示在数据表视图中。
提示: 如果不希望 “价格 ”列的标题显示为 MaxOfPrice 或 MinOfPrice,请在“设计”视图中打开查询,然后在网格的“价格”列中键入“ Price: MaxOfPrice” 或 “Price: MinOfPrice”。 Price 将在数据表视图中显示为列的标题。
查找最近和最早的日期
在本文前面创建的查询可以返回顶部或底部值,但不能同时返回两者。 如果要在单个视图中查看这两组值,则需要创建两个查询(一个用于检索顶部值,另一个用于检索底部值),然后将结果合并并存储在单个表中。
查找顶部和底部值并在表中显示该数据的过程遵循以下广泛的步骤:
-
创建顶部值和底部值查询,如果需要对数据进行分组,请创建使用 Min 和 Max 函数的总计查询。
-
将 top 值查询 (或最大总计查询) 覆盖到生成表查询中,并创建新表。
-
将底部值查询 (或最小总计查询) 转换为追加查询,并将记录追加到顶部值表中。
这些部分中的步骤介绍了如何执行此操作。
创建查询
-
创建顶部和底部值查询。
有关创建顶部或底部值查询所需的步骤,请参阅本文前面的 查找最近或最早的日期。 如果需要按类别对记录进行分组,请参阅本文前面的 查找类别或组中记录的最近或最早日期。
如果使用最后一节中的示例表,请仅使用“事件”表中的数据。 在这两个查询中使用“事件”表中的“事件类型”、“客户”和“事件日期”字段。
-
使用有意义的名称(例如 Top Value 和 Bottom Value)保存每个查询,并在后续步骤中将其保留为打开状态以供使用。
-
创建生成表查询
-
在设计视图中打开 top 值查询后:
在“ 查询设计 ”选项卡上的“ 查询类型 ”组中,单击“ 创建表”。
随即显示“生成表”对话框。
-
在“ 表名称 ”框中,键入将存储顶部和底部记录的表的名称。 例如,键入 “顶部记录”和“底部记录”,然后单击“ 确定”。
每次运行查询时,查询都会创建一个表,并将顶部值替换为当前数据,而不是在数据表视图中显示结果。
-
保存并关闭查询。
创建追加查询
-
在设计视图中使用底部值查询:
在“ 查询设计 ”选项卡上的“ 查询类型 ”组中,单击“ 追加”。
-
将出现“追加”对话框。
-
键入与在“ 生成表 ”对话框中键入的名称相同。
例如,键入 “顶部记录”和“底部记录”,然后单击“ 确定”。 每次运行查询时,查询都会将记录追加到“顶部记录”和“底部记录”表中,而不是在“数据表”视图中显示结果。
-
保存并关闭查询。
运行查询
-
现在可以运行这两个查询了。 在导航窗格中,双击顶部值查询,并在 Access 提示时单击“ 是 ”。 然后双击“底部值”查询,并在 Access 提示时单击“ 是 ”。
-
在数据表视图中打开“顶部和底部记录”表。
重要: 如果尝试运行生成表或追加查询,但似乎未发生任何操作,请检查 Access 状态栏以获取以下消息:
“此操作或事件已被禁用模式阻止。”
如果看到该消息,请执行以下步骤:
-
选择 “启用此内容 ”,然后单击“ 确定”。
-
再次运行查询。