查找日期最近或最早的记录

本文介绍如何使用顶级值查询查找一组记录中的最近日期或最早日期。 可以使用这种类型的查询返回的信息回答各种业务问题,例如客户上次下订单时。

想进行什么操作?

了解最高值查询如何与日期一起工作

当需要查找在一个表或一组记录中包含最新或最早日期的记录时,请使用最高值查询。 然后,可以使用数据回答多种业务问题,例如:

  • 员工最后一次进行销售是何时? 答案可以帮助你确定最高效或最不高效的员工。

  • 客户上次下单是何时? 如果客户在给定时段内没有下订单,你可能希望将客户移到非活动列表。

  • 谁有下一个生日或下 n 个生日?

用于创建和使用最高值查询的规则

首先通过创建选择查询来创建顶级值查询。 根据想要的结果,对查询应用排序顺序,或者将查询转换为总计查询。 如果转换查询,则使用聚合函数(如MaxMin)返回最大值或最小值,或者使用 First或Last返回最早或最新日期。 只有在需要查找属于一组组或类别的数据时,才使用总计查询和聚合函数。 例如,假设你需要查找贵公司运营的每个城市的给定日期的销售数字。 在这种情况下,城市将成为 (查找每个城市的数据) ,因此请使用总计查询。

在继续操作时,请记住,无论查询类型如何,查询都必须使用包含描述性数据的字段,例如客户名称,以及包含要查找的日期值的字段。 此外,日期值必须位于设置为"日期/时间"字段的数据类型。 如果尝试针对文本字段中的日期值运行查询,本文介绍的查询会失败。 此外,如果要使用总计查询,数据字段必须包含类别信息,例如城市或国家/地区字段。

在热门值查询和筛选器之间选择

若要确定是否应创建热门值查询或应用筛选器,请选择以下选项之一:

  • 如果要返回字段中具有最近日期或最新日期的记录,但不知道确切的日期值,或者它们无关紧要,请创建一个顶级值查询。

  • 如果要返回日期匹配、日期晚于或晚于特定日期的所有记录,请使用筛选器。 例如,若要查看 4 月和 7 月之间的销售日期,请应用筛选器。 有关筛选器的完整讨论超出了本主题的范围。

    有关创建和使用筛选器的信息,请参阅"应用筛选器"一文, 以查看 Access 数据库中的选择记录

返回页首

查找最近或最早日期

本部分中的步骤介绍如何创建使用排序顺序的基本顶级值查询,以及使用表达式和其他条件的更高级查询。 第一部分演示创建最高值查询的基本步骤,第二部分介绍如何通过添加条件查找接下来的几个员工生日。 这些步骤使用以下示例表中的数据。

姓氏

名字

地址

城市

国家/地区

出生日期

聘用日期

刘鹏

Josh

1 Main St.

New York

USA

05-Feb-1968

10-Jun-1994

Heloo

Waleed

52 1st St.

Boston

USA

1957 年 5 月 22 日

1996 年 11 月 22 日

潘杰

Guido

3122 75th Ave. S.W.

Seattle

USA

11-Nov-1960

2000 年 3 月 11 日

Bagel

IpipIppe

1 Contoso Blvd.

London

英国

1964 年 3 月 22 日

22-Jun-1998

价格

Julian

Calle Smith 2

墨西哥城

墨西哥

05-Jun-1972

2002 年 1 月 5 日

四分

Christine

3122 75th St. S.

Seattle

USA

1970 年 1 月 23 日

1999 年 4 月 23 日

Riley

Steve

67 Big St.

Tampa

USA

14-Apr-1964

2004 年 10 月 14 日

Birkby

Dana

2 不毛 Pkwy

珠海

USA

1959 年 10 月 29 日

1997 年 3 月 29 日

如果需要,可以手动将此示例数据输入到新表中,也可以将此示例表复制到 Microsoft Excel 等电子表格程序,然后使用 Access 将生成的工作表导入表中。

创建基本热门值查询

  1. 在“创建”选项卡上的“查询”组中,单击“查询设计”。

  2. 在对话框中,单击要用于查询的表,单击"添加"以将表放在设计器的上半部分,然后单击"关闭"。

    - 或 -

    双击该表,然后单击"关闭"。

    如果使用上一部分列出的示例数据,请向查询添加"员工"表。

  3. 将查询中要使用的字段添加到设计网格。 可以双击每个字段,或者将每个字段拖放到"字段"行的 空白单元格上

    如果使用示例表,请添加"名字"、姓氏和"出生日期"字段。

  4. 在"出生日期"字段中 (或底值,如果使用示例表) ,请单击"排序"行并选择"升序"或"降序"。

    降序返回最近日期,升序返回最早日期。

    重要: 必须仅在"排序" 行中为 包含日期的字段设置值。 如果为另一个字段指定排序顺序,查询不会返回想要的结果。

  5. 在"设计"选项卡上的"查询设置"组中,单击"前值"列表) 旁边的"所有 ("旁边的向下箭头,然后输入要查看的记录数,或者从列表中选择一个选项。

  6. 单击 按钮图像 运行查询,在数据表视图中显示结果。

  7. 保存查询并将其保持打开状态,供接下来的步骤使用。

可以看到,这种类型的顶级值查询可以回答基本问题,例如,谁是公司中最年长或最陈旧的人。 接下来的步骤介绍如何使用表达式和其他条件为查询增加功能和灵活性。 下一步中显示的条件返回接下来的三个员工生日。

向查询添加条件

注意: 这些步骤假定你将使用上一部分所述的查询。

  1. 将前面步骤中创建的查询切换为"设计"视图。

  2. 在查询设计网格中,在"出生日期"列右侧列中,复制并粘贴或键入以下表达式:Expr1:DatePart ("m",[Birth Date]) 。 然后单击"运行"。

    DatePart函数提取"出生日期"字段的月份部分。

  3. 切换到设计视图。

  4. 第一个表达式的右侧,粘贴或键入以下表达式:Expr2:DatePart ("d",[Birth Date]) 。 然后单击"运行"。

    在这种情况下 ,DatePart 函数提取"出生日期"字段的日期部分。

  5. 切换到设计视图。

  6. 清除刚刚输入的两个表达式的"显示"行中的复选框,单击每个表达式的"排序"行,然后选择"升序"。

  7. 单击“运行”

  8. (可选)可以指定一个条件来限制查询的范围。 指定条件时,查询仅对满足条件的记录进行排序,并标识排序列表中的顶部或底部字段值。

    若要继续处理示例数据,请切换到"设计"视图。 然后,在 " 出生日期"列的"条件 "行中 ,键入以下表达式:

    Month ([Birth Date]) > Month (Date () ) or Month ([Birth Date]) = Month (Date () ) And Day ([Birth Date]) >Day (Date () )

    此表达式执行以下操作:Month ([Birth Date]) > Month (Date () ) 部分检查每个员工的出生日期,以查看其是否属于将来的月份,如果为 true,则查询中包含这些记录。 表达式的月份 ([出生日期]) = 月份 (日期 () ) 和日 ([出生日期]) >日 (日期 () ) 部分检查当月发生的出生日期,以查看生日是在当前日期的当天还是当天之后。 如果该条件为 true,则函数在查询中包括这些记录。 总结:此表达式将忽略生日在 1 月 1 日到运行查询的日期之间的任何记录。

    若要查看查询条件表达式的更多示例,请参阅"查询 条件示例"一文

  9. 在"设计"选项卡上的"查询设置"组中,单击"前值"列表) 旁边的"所有 ("旁边的向下箭头,然后输入要查看的记录数,或者从列表中选择一个选项。

    若要查看接下来的三个生日,请键入3。

  10. 单击 按钮图像 运行查询,在数据表视图中显示结果。

如果看到的记录数超过指定

如果数据包含多个共享日期值的记录,则排名前的值查询可能返回的数据可能超过指定。 例如,可以设计一个顶级值查询来检索三个员工记录,但该查询返回四条记录,因为"Edward"和"Edwards"共享生日,如下表所示。

LastName

BirthDate

Berka

9/26/1968

杰克逊

10/2/1970

Edwards

10/15/1965

美国

10/15/1969

如果看到的记录数少于指定的记录数

假设你设计一个查询来返回字段中前五条或后五条记录,但该查询只返回三条记录。 一般来说,通过在设计视图中打开查询并查看设计网格中列的"条件"行,可以解决这种类型的问题。

有关条件详细信息,请参阅"查询 条件示例"一文

如果看到重复记录

如果顶级值查询返回重复项,则基础表包含重复记录,或者记录看起来重复,因为查询不包含可区分记录的字段。 例如,下表显示了返回最近发货的五个订单以及处理交易的销售人员姓名的查询结果。

ShippedDate

销售人员

11/12/2004

Freitag

11/12/2004

Cajhen

10/12/2004

Delgado

10/12/2004

Delgado

10/12/2004

Freitag

第三条和第四条记录似乎重复,但销售人员 Delgado 可能在同一天处理了两份不同的订单。

根据你的要求,你可以执行两项操作之一以避免返回重复记录。 可以更改查询的设计,以添加有助于区分记录的字段,例如 OrderID 和 CustomerID 字段。 或者,如果只需查看其中一条重复记录,则可以通过将查询的唯一值属性设置为"是"来只显示不同的记录。 若要设置此属性,请在查询设计视图中,右键单击查询设计器上半部分空白区域中的任意位置,然后单击快捷菜单上的"属性"。 在查询属性表中,找到"唯一"属性,并设置为"是"。

有关处理重复记录的信息,请参阅"查找、隐藏或消除 重复数据"一文

返回页首

查找类别或组中记录的最近或最早日期

使用总计查询查找属于组或类别的记录的最早或最新日期。 汇总查询是一个选择查询,它使用聚合函数(如Min、Max、Sum、First 和Last)计算给定字段的值。

本部分中的步骤假定你运行事件管理业务 - 负责过渡、照明、餐饮和大型功能的其他方面。 此外,您管理的事件分为多个类别,例如产品发布、街道集市和音乐会。 本部分中的步骤说明如何回答一个常见问题:下一个事件是何时按类别分类的? 换言之,下一次产品发布时间、下一场音乐会等何时推出。

在继续操作时,请记住以下事项:默认情况下,您在此处创建的总计查询类型只能包含包含组或类别数据的字段以及包含日期的字段。 不能包含描述类别中项目的其他字段,例如客户或供应商名称。 但是,可以创建第二个查询,将总计查询与包含描述性数据的字段组合在一起。 本部分稍后的步骤将介绍如何执行该任务。

本部分中的步骤假定使用以下三个表:

"事件类型"表    

TypeID

事件类型

1

产品发布

2

企业函数

3

Private 函数

4

基金基金

5

展商展

6

演讲

7

Concert

8

附件

9

Street Fair

“客户”表    

客户 ID

公司

联系人

1

康拓工程有限公司 图形

Jonathan Haas

2

Tailspin Toys

Ellen Adams

3

Fabrikam

Carol Philips

4

Wingtip Toys

Lucio Iallo

5

A. Datum

Mandar Samant

6

嘉元实业

Brian Burke

7

设计协会

Jaka Stele

8

艺术学校

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

Concert

艺术学校

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

Street Fair

Graphic Design Institute

7/4/2003

¥55,000

注意: 本部分中的步骤假定"客户"表和"事件类型"表位于与事件表的一对多关系的"一"端。 在这种情况下,Events 表共享 CustomerID 和 TypeID 字段。 没有这些关系,下一部分所述的总计查询将不起作用。

如何将此数据添加到数据库?

若要将这些示例表添加到数据库,可以将数据复制到 Excel,然后导入数据,但有一些例外:

  • 将"事件类型和客户"表复制到 Excel 时,请勿复制 TypeID 和 CustomerID 列。 导入工作表时,Access 将添加主键值;这可以节省一些时间。

  • 导入表后,必须在"设计"视图中打开"事件"表,并将"事件类型"和"客户"列转换为查找字段。 为此,请单击每个字段的"数据类型"列,然后单击"查找向导"。

    在创建查找字段时,Access 将"事件类型"和"客户"列中的文本值替换为源表中的数字值。

    有关创建和使用查找字段的信息,请参阅文章"创建或删除多值字段 "和"多值字段指南"。 这两篇文章都介绍了如何创建一种类型的查找字段,允许您为给定字段选择多个值,并说明如何创建查找列表。

创建总计查询

  1. 在“创建”选项卡上的“查询”组中,单击“查询设计”。

  2. 双击想要使用的表。 每个表显示在查询设计器的上半部分。

    如果使用上面列出的示例表,请添加"事件"和"事件类型"表。

  3. 双击要用于查询的表字段。 请确保此时仅向查询添加组或类别字段和值字段。

    如果使用上述三个表中列出的示例数据,请从"事件类型"表中添加"事件类型"字段,或者从"事件"表中添加"事件日期"字段。

  4. (可选)可以指定限制查询范围的条件。 仅对符合条件的记录进行排序,并在此排序列表中标识顶部和底部字段值。

    例如,如果要返回"专用函数"类别中的事件,在"事件类型"列的"条件"行中键入此表达式:<>"Private Function"。

    若要查看查询条件表达式的更多示例,请参阅"查询 条件示例"一文

  5. 执行以下操作,将查询转换为总计查询:

    “设计”选项卡上的“显示/隐藏”组中,单击“总计”

    " 总计" 行显示在设计网格中。

  6. 确保每个组或类别字段的"总计"行设置为"分组者",然后将值字段的"总计"行 (将具有顶部或底部值的字段的"总计) 设置为"最大值"或"最小值"。

    Max 返回数字字段中的最大值,以及日期/时间字段中的最新日期或时间值。 Min 返回数字字段中的最小值,以及日期/时间字段中的最早日期或时间值。

  7. 在"设计"选项卡上的"查询设置"组中,单击"前值"列表) 旁边的"所有 ("旁边的向下箭头,然后输入要查看的记录数,或者从列表中选择一个选项。

    在这种情况下,请选择"全部",然后单击"运行"以在数据表视图中显示结果。

    注意: 根据步骤 6 中选择的函数,Access 将查询中值字段的名称更改为MaxOfFieldNameMinOfFieldName。 如果使用示例表,Access 将重命名字段 MaxOfEvent DateMinOfEvent Date。

  8. 保存查询并转到下一步。

查询结果不会显示产品名称或有关该产品的其他任何信息。 若要查看其他数据,需要创建第二个包含刚刚创建的查询的查询。 接下来的步骤介绍了如何这样做。

创建第二个查询以添加更多数据

  1. 在“创建”选项卡上的“查询”组中,单击“查询设计”。

  2. 单击 "查询" 选项卡,然后双击在上一部分创建的总计查询。

  3. 单击 "表 "选项卡并添加在总计查询中使用的表,并添加包含其他相关数据的任何表。 如果使用上述三个示例表,则向新查询添加事件类型、事件和客户表。

  4. 将总计查询中的字段联接到父表中的对应字段。 为此,请将总计查询中的每个字段拖动到表中的对应字段。

    如果使用三个表中的示例数据,请将总计查询中的"事件类型"列拖动到"事件类型"表中的"事件类型"字段。 然后将总计查询中的 MaxOfEvent Date 列拖动到"事件"表中的"事件日期"字段。 通过创建这些联接,新的选择查询能够将总计查询中的数据和其他表中的数据汇集在一起。

  5. 添加查询中其他表中的其他描述性字段。

    如果使用三个表中的示例数据,可以从"客户"表中添加"公司"和"联系人"字段。

  6. (可选)为一个或多个列指定排序顺序。 例如,若要按字母顺序列出类别,将"事件类型"列的"排序"行设置为"升序"。

  7. 在“设计”选项卡上的“结果”组中,单击“运行”。

    查询的结果显示在数据表视图中。

提示:  如果不希望"价格"列的标题显示为MaxOfPriceMinOfPrice,请在设计视图中打开查询,在网格中的"价格"列中键入Price:MaxOfPricePrice:MinOfPrice。价格 将在数据表视图中显示为列的标题。

返回页首

查找最近日期和最早日期

本文前面创建的查询可以返回顶部或底部值,但不能同时返回两者。 如果要在单个视图中查看这两组值,则需要创建两个查询(一个查询检索最上方的值,另一个检索底部值)然后将结果合并并存储在单个表中。

查找顶部和底部值以及显示表中的数据的过程遵循以下宽泛步骤:

  • 创建一个顶级值和一个底部值查询,或者,如果需要对数据进行分组,则创建使用 Min 和 Max 函数的 总计 查询。

  • 将热门值查询 (或最大总计) 到生成表查询中,并创建新表。

  • 将底部值查询 (或最小总计查询) 追加查询,并将记录追加到最高值表中。

    这些部分中的步骤介绍了如何这样做。

    创建查询

    1. 创建顶部和底部值查询。

      有关创建顶部或底部值查询所需的步骤,请参阅本文前面部分 中的"查找最新日期"或"最早日期"。 如果需要按类别对记录进行分组,请参阅本文前面 部分查找类别或组中记录的最近或最早日期。

      如果使用上一节中的示例表,则仅使用 Events 表中的数据。 在两个查询中,使用"事件"表中的"事件类型"、"客户"和"事件日期"字段。

    2. 使用有意义的名称(如"最高值"和"底部值")保存每个查询,并将其保持打开状态,供下一步使用。

创建生成表查询

  1. 在设计视图中打开热门值查询后:

    在“设计”选项卡上的“查询类型”组中,单击“生成表”。

    随即显示“生成表”对话框。

  2. "表名称 "框中,键入用于存储顶部和底部记录的表的名称。 例如,键入"顶部"和"底部记录",然后单击"确定"。

    每次运行查询时,查询将创建一个表,将顶部值替换为当前数据,而不是在数据表视图中显示结果。

  3. 保存并关闭查询。

创建追加查询

  1. 在设计视图中使用底部值查询:

    “设计”选项卡上的“查询类型”组中,单击“追加”

  2. 将出现“追加”对话框。

  3. 键入在"创建表"对话框中 键入的 同一名称。

    例如,键入"顶部"和"底部记录",然后单击"确定"。 每次运行查询时,查询不会在数据表视图中显示结果,而是将记录追加到"顶部"和"底部记录"表中。

  4. 保存并关闭查询。

运行查询

  • 现在,可以运行这两个查询。 在导航窗格中,双击顶部值查询,当 Access 提示时单击"是"。 然后双击"下值"查询 ,然后在 Access 提示时单击"是"。

  • 在数据表视图中打开"顶部"和"底部记录"表。

重要: 如果尝试运行 make-table 或追加查询,但似乎没有任何反应,请检查 Access 状态栏中的以下消息:

“此操作或事件已被禁用模式阻止。”

如果看到该消息,请执行以下步骤:

  • 如果尚未显示,则显示消息栏。 为此,请在"数据库工具"选项卡上的"显示/隐藏"组中单击"消息栏"。

  • 在消息栏中,单击“选项”。

    将显示“Microsoft Office 安全选项”对话框。

  • 选择"启用此内容",然后单击"确定"。

  • 再次运行查询。

返回页首

需要更多帮助?

扩展你的 Office 技能
了解培训
抢先获得新功能
加入 Office 预览体验计划

此信息是否有帮助?

谢谢您的反馈!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×