Поиск записей с самыми последними или самыми давними датами

Применяется к
Access для Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

В этой статье объясняется, как использовать запрос основных значений в Access для поиска самых последних или ранних дат в наборе записей. Результаты можно использовать для ответа на деловые вопросы, например, когда клиент в последний раз размещал заказ.

Выберите нужное действие

Сведения о работе запросов на набор значений с датами

Запросы на набор значений используются, когда возникает необходимость найти в таблице или группе записи, содержащие самую последнюю или самую давнюю дату. Полученные данные позволят отвечать на различные деловые вопросы, например следующие:

  • Когда сотрудник в последний раз продавал товар? Ответ на этот вопрос поможет вам определить наиболее продуктивного или наименее продуктивного сотрудника.
  • Когда клиент делал заказ в последний раз? Если в течение определенного периода заказов не было, его можно перенести в список неактивных клиентов.
  • У кого следующий день рождения или следующие n дней рождения?

Правила создания и использования запросов на набор значений

Для создания запроса на получение наилучших значений сначала нужно создать запрос на выборку. В зависимости от требуемых результатов к запросу можно применить порядок сортировки или преобразовать его в итоговый запрос. При преобразовании запроса используется агрегатная функция, например Max "или Min ", для возвращения наибольшего или наименьшего значения или First "или" Last для возврата самой ранней или самой большой даты. Используйте итоговые запросы и агрегатные функции только в том случае, если необходимо найти данные, которые попадают в группы или категории. Например, если вам нужно найти показатели продаж на определенную дату для каждого города присутствия компании, города преобразуются в категории, поэтому используется итоговый запрос.

Помните, что в запросах необходимо использовать поля, содержащие описательные данные, такие как имена клиентов, а также поле со значениями дат, которые нужно найти. Значения даты должны находиться в поле с этим типом Date/Time данных. Запросы, приведенные в этой статье, завершаются ошибкой, если выполнять их для значений дат в Short Text поле. Если вы хотите использовать итоговый запрос, поля данных должны также содержать сведения о категории, такие как поле города или страны или региона.

Выбор между запросом на набор значений и фильтром

Чтобы определить, стоит ли создавать запрос на набор значений или же следует применить фильтр, примите во внимание следующее:

  • Если вы хотите получить записи, в полях которых содержатся самые последние или самые давние даты, а точные значения дат неизвестны или не имеют значения, следует создать запрос на набор значений.
  • Если вы хотите получить все записи, в которых даты совпадают с определенной датой, предшествуют ей или следуют за ней, используйте фильтр. Например, для просмотра дат продаж между апрелем и июлем нужно применить фильтр. Подробное обсуждение фильтров выходит за пределы данной темы. Дополнительные сведения о создании и использовании фильтров см. в статье "Применение фильтра для просмотра отдельных записей в базе данных Access".

К началу страницы

Поиск самой последней или самой давней даты

Шаги, описанные в этом разделе, объясняют, как создать базовый запрос на получение высших значений, использующий порядок сортировки, и более сложный запрос, использующий выражения и другие условия. В первой части описаны основные действия по созданию запроса на основные значения. Во второй части объясняется, как найти несколько следующих дней рождения сотрудников, добавив условия. Используются данные из следующей таблицы.

Фамилия Имя Адрес Город Страна или регион Дата рождения Дата приема на работу
Авдеев Григорий Загородное шоссе, д. 150 Москва РФ 05-фев-1968 10-июн-1994
Кузнецов Артем ул. Гарибальди, д. 170 Пермь РФ 22-май-1957 22-ноя-1996
Дегтярев Дмитрий ул. Кедрова, д. 54 Красноярск РФ 11-ноя-1960 11-мар-2000
Зуева Ольга ул. Губкина, д. 233 Тверь РФ 22-мар-1964 22-июн-1998
Белых Николай пл. Хо Ши Мина, д. 15, кв. 5 Москва РФ 05-июн-1972 05-янв-2002
Комарова Лина ул. Ляпунова, д. 70, кв. 16 Красноярск РФ 23-янв-1970 23-апр-1999
Зайцев Сергей ул. Строителей, д. 150, кв. 78 Омск РФ 14-апр-1964 14-окт-2004
Ермолаева Анна ул. Вавилова, д. 151, кв. 8 Иркутск РФ 29-окт-1959 29-мар-1997

При необходимости вы можете ввести образец данных в новую таблицу вручную или скопировать образец таблицы в программу для работы с электронными таблицами, например Microsoft Excel, а затем импортировать полученный лист в таблицу с помощью Access.

Создание простого запроса на набор значений

  1. На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.

  2. В диалоговом окне щелкните таблицу, которую вы хотите использовать в запросе, нажмите Добавить, чтобы поместить ее в верхний раздел конструктора запросов, и нажмите кнопку Закрыть. Или дважды щелкните таблицу и нажмите кнопку Закрыть. Если вы используете образец данных, приведенный в предыдущем разделе, добавьте таблицу Employees в запрос.

  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()) фрагмент проверяет дату рождения каждого сотрудника, чтобы узнать, выпадает ли она на будущий месяц. Если да, запрос включает эту запись. Этот Month([Birth Date]) = Month(Date()) And Day([Birth Date]) > Day(Date()) фрагмент проверяет даты рождения в текущем месяце, чтобы узнать, выпадает ли день рождения на текущий день или следует за ним. Если да, запрос включает эту запись. Короче говоря, это выражение игнорирует все записи, день рождения которых приходится на период между 1 января и днем выполнения запроса. Другие примеры выражений условий для запросов можно найти в статье Примеры условий запроса.
  9. На вкладке "Конструктор запросов " в группе "Настройка запроса " щелкните стрелку вниз рядом с "Все " в списке "Лучшие значения ". Затем введите количество записей, которые хотите просмотреть, или выберите вариант из списка. Чтобы увидеть следующие три дня рождения, введите 3.
  10. Нажмите кнопку "Выполнить", чтобы выполнить запрос и отобразить результаты в режиме таблицы.

Если отображается больше записей, чем требовалось

Если в данных есть записи с одинаковым значением даты, запрос может возвращать больше записей, чем вы указали. Например, вы можете создать запрос на набор значений для получения записей о трех сотрудниках, н запрос вернет четыре, поскольку у Измайлова и Быкова дни рождения совпадают, как указано в следующей таблице.

Фамилия ДатаРождения
Белых 26.09.1968
Бутусов 02.10.1970
Измайлов 15.10.1965
Быков 15.10.1969

Если отображается меньше записей, чем требовалось

Предположим, что вы создали запрос, возвращающий наибольшие или наименьшие пять записей в поле, но он возвращает только три. Как правило, чтобы решить эту проблему, нужно открыть запрос в Конструкторе и проверить строку Условия отбора для столбцов в бланке запроса.

Дополнительные сведения об условиях см. в статье Примеры условий запроса.

Если выводятся повторяющиеся записи

Если запрос на набор значений возвращает повторяющиеся значения, то либо базовые таблицы содержат повторяющиеся записи, либо записи отображаются как одинаковые, потому что запрос не включает поля, значения которых позволяют их различить. Например, в следующей таблице показан результат запроса, отображающего пять последних отгруженных заказов вместе с именем продавца, который проводил транзакцию.

Дата поставки Продавец
12.11.2004 Ковалев
12.11.2004 Маслов
12.10.2004 Попов
12.10.2004 Попов
12.10.2004 Ковалев

Третья и четвертая записи кажутся одинаковыми, но это может объясняться тем, что Попов обработал два различных заказа, отгруженных в один день.

Чтобы избежать отображения повторяющихся записей, можно выполнить одно из двух действий в зависимости от требуемого результата. Вы можете изменить структуру запроса, добавив поля, которые позволят различить записи, например поля "КодЗаказа" и "КодКлиента". Или, если достаточно показать только одну из повторяющихся записей, вы можете выбрать отображение только уникальных записей, задав значение Да для свойства запроса Уникальные значения. Чтобы задать значение этого свойства, в Конструктор щелкните правой кнопкой мыши в любом свободном месте в верхней половине окна конструктора запросов и выберите в контекстном меню команду Свойства. В окне свойств найдите свойство Уникальные значения и задайте для него значение Да.

Дополнительные сведения о работе с дублирующимися записями см. в статье Поиск дубликатов записей с помощью запроса.

К началу страницы

Поиск самых последних или самых давних дат для записей в категории или группе

Для поиска самых последних или самых давних дат для записей, входящих в группы или категории, используются итоговые запросы. Итоговый запрос — это запрос на выборку, в котором используются агрегатные функции, SumFirstтакие как Min, Max, для Last вычисления значений заданного поля.

Шаги, описанные в этом разделе, предполагают, что вы занимаетесь организацией организации мероприятий. Вы занимаетесь постановкой, освещением, кейтерингом и другими частями больших функций. Мероприятия, которыми вы управляете, делятся на несколько категорий, например запуск продуктов, уличные ярмарки и концерты. Шаги в этом разделе объясняют, как ответить на распространенный вопрос: когда будет следующее событие по категориям? Другими словами, когда будет следующий запуск продукта, следующий концерт и так далее?

При этом учитывайте следующее: По умолчанию тип итогового запроса, создаваемого здесь, может включать только поле, содержащее данные группы или категории, и поле, содержащее ваши даты. Невозможно включить другие поля, описывающие элементы категории, такие как имена клиентов или поставщиков. Однако вы можете создать второй запрос, в котором будут содержаться итоговые запросы и поля с описательными данными. Ниже описано, как это сделать.

Инструкции в данном разделе предполагают использование следующих трех таблиц:

Таблица "Типы мероприятий"

КодТипа Тип мероприятия
1 Презентация товара
2 Корпоративное мероприятие
3 Частное мероприятие
4 Мероприятие по сбору средств
5 Выставка-продажа
6 Лекция
7 Концерт
8 Выставка
9 Уличная ярмарка

Таблица "Клиенты"

КодКлиента Компания Контакт
1 Contoso, Ltd. НИИ Николай Белых
2 Лесопитомник Регина Покровская
3 Fabrikam Елена Матвеева
4 Лесопитомник Афанасий Быков
5 А. Datum Лилия Медведева
6 Adventure Works Максим Измайлов
7 железа Арина Иванова
8 Художественная школа Полина Кольцова

Таблица "Мероприятия"

КодМероприятия Тип мероприятия Клиент Дата мероприятия Цена
1 Презентация товара Contoso, Ltd. 14.04.2003 10 000 ₽
2 Корпоративное мероприятие Лесопитомник 21.04.2003 8000 ₽
3 Выставка-продажа Лесопитомник 01.05.2003 25000 ₽
4 Выставка НИИ железа 13.05.2003 4 500 ₽
5 Выставка-продажа Contoso, Ltd. 14.05.2003 55 000 ₽
6 Концерт Художественная школа 23.05.2003 12 000 ₽
7 Презентация товара А. Datum 01.06.2003 15 000 ₽
8 Презентация товара Лесопитомник 18.06.2003 21 000 ₽
9 Мероприятие по сбору средств Adventure Works 22.06.2003 1300 ₽
10 Лекция НИИ железа 25.06.2003 2450 ₽
11 Лекция Contoso, Ltd. 04.07.2003 3800 ₽
12 Уличная ярмарка НИИ железа 04.07.2003 5500 ₽

Примечание

В этом разделе предполагается, что таблицы "Клиенты " и "Тип события " находятся на стороне "один" связей "один-ко-многим" с таблицей "События ". В этом случае в таблице "События " используются общие поля and CustomerIDTypeID . Итоговые запросы, описанные в следующих разделах, не будут работать без этих связей.

Как добавить эти данные в базу данных?

Чтобы добавить эти примеры таблиц в базу данных, вы можете скопировать данные в Excel, а затем импортировать данные, но с некоторыми исключениями.

  • При копировании таблиц "Типы событий " и "Клиенты " в Excel не копируйте TypeID столбцы and CustomerID . При импорте листов Access автоматически добавляет значения первичного ключа, что позволяет сэкономить время.
  • После импорта таблиц нужно открыть таблицу "События " в режиме конструктора и преобразовать столбцы "Тип события " и "Клиент " в поля подстановки. Для этого выберите столбец " Тип данных " для каждого поля, а затем выберите пункт "Мастер подстановок". В ходе создания полей подстановки Access заменяет текстовые значения столбцов "Тип мероприятия" и "Клиент" числовыми значениями из исходных таблиц. Дополнительные сведения о создании и использовании полей подстановки см. в статьях Создание и удаление многозначного поля. В этой статье объясняется, как создать тип поля подстановки, позволяющий выбрать несколько значений для одного поля, а также как создавать списки подстановки.

Создание итогового запроса

  1. На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.

  2. Дважды щелкните таблицы, которые нужно использовать. Таблицы появятся в верхней части конструктора запросов. При использовании приведенных выше примеров добавьте таблицы "Мероприятия" и "Типы мероприятий".

  3. Дважды щелкните поля таблицы, которые вы хотите использовать в запросе. На данном этапе к запросу следует добавить только поля категорий или групп и поле значений. При использовании данных из трех приведенных выше таблиц следует добавить либо поле "Тип мероприятия" из таблицы "Типы мероприятий", либо поле "Дата мероприятия" из таблицы "Мероприятия".

  4. При необходимости вы можете указать условие для ограничения области запроса. Сортироваться будут только записи, удовлетворяющие этому условию, и в отсортированном списке будут определены первые и последние значения полей. Например, если вы хотите возвращать события в категории "Приватная функция", введите следующее выражение в строке "Условие " столбца "Тип события ": <>"Private Function". Другие примеры выражений условий для запросов можно найти в статье Примеры условий запроса.

  5. Преобразовать запрос в итоговый запрос, выполнив указанные ниже действия. На вкладке "Конструктор запросов " в группе "Показать или скрыть " нажмите кнопку "Итоги". В бланке запроса появится строка Итоги.

  6. Убедитесь, что в строке Итоги поля каждой группы или категории выбран пункт Группировка по, и выберите для строки Итоги поля значения (поля с наибольшими или наименьшими значениями) функцию Max или Min. Max Возвращает наибольшее значение числового поля и последнее значение Date/Time даты или времени в поле. Min Возвращает наименьшее значение числового поля и самое раннее значение Date/Time даты или времени в поле.

  7. На вкладке "Конструктор запросов " в группе "Настройка запроса " щелкните стрелку вниз рядом с "Все " в списке "Лучшие значения ". Затем введите количество записей, которые хотите просмотреть, или выберите вариант из списка. В этом случае для просмотра результатов в режиме таблицы выберите параметр Все и нажмите кнопку Выполнить.

    Примечание

    В зависимости от функции, выбранной на шаге 6, Access изменяет имя поля значений в запросе на MaxOfFieldName или MinOfFieldName. В нашем примере поле будут переименовано в Максимум_Дата мероприятия или Минимум_Дата мероприятия.

  8. Сохраните запрос и переходите к следующим шагам.

Запрос не возвращает названия продуктов и другую информацию о них. Чтобы просмотреть дополнительные данные, необходимо создать второй запрос, который включает в себя запрос, который вы только что создали. Далее описано, как это сделать.

Создание второго запроса для отображения более подробных данных

  1. На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
  2. Перейдите на вкладку "Запросы " и дважды щелкните итоговый запрос, созданный в предыдущем разделе.
  3. Откройте вкладку Таблицы и добавьте таблицы, которые вы использовали в итоговом запросе, а также таблицы, в которых содержатся дополнительные данные. Если вы использовали три таблицы из примера, добавьте в новый запрос таблицы "Типы мероприятий", "Мероприятия" и "Клиенты".
  4. Свяжите поля в итоговом запросе с соответствующими полями в родительских таблицах. Для этого перетащите каждое поле из итогового запроса на соответствующее поле в таблице. Если вы используете образец данных из трех таблиц, перетащите столбец "Тип события " в итоговом запросе в поле "Тип события " в таблице "Тип события ". Затем перетащите столбец "Дата MaxOfEvent " в итоговом запросе в поле "Дата события " в таблице "События ". Эти соединения позволяют объединить данные итогового запроса и данные других таблиц.
  5. Добавьте в запрос поля с дополнительной информацией из других таблиц. При использовании примеров данных из трех таблиц можно добавить поля "Компания" и "Контакт" из таблицы "Клиенты".
  6. При желании вы можете задать порядок сортировки по одному или нескольким столбцам. Например, для вывода категорий в алфавитном порядке задайте в строке Сортировка столбца Тип мероприятия значение По возрастанию.
  7. На вкладке "Конструктор запросов " в группе "Результаты " нажмите кнопку "Выполнить". Результаты запроса отображаются в режиме таблицы.

Совет.

Если вы не хотите, чтобы заголовок столбца "Цена " отображался как "MaxOfPrice " или "MinOfPrice", откройте запрос в Конструкторе и в столбце "Цена" в сетке введите Price: MaxOfPrice или Price: MinOfPrice. В режиме таблицы в заголовке столбца отображается "Цена".

К началу страницы

Одновременный поиск самых последних и самых давних дат

Запросы, созданные ранее в этой статье, возвращают либо наибольшие, либо наименьшие значения, но не оба набора сразу. Если вы хотите просмотреть оба набора значений в одном представлении, создайте два запроса: один из них будет получать максимальные значения, а другой — минимальные. Затем объедините и сохраните результаты в одной таблице.

Поиск наибольших и наименьших значений и отображение этих данных в таблице состоит из следующих основных этапов:

  • Создайте запросы на получение наилучших и последних значений. Чтобы сгруппировать данные, создайте итоговые запросы с функциями Min and Max .

  • Преобразуйте запрос основных значений или Max итоговый запрос в запрос на создание таблицы и создайте новую таблицу.

  • Преобразуйте запрос о последних значениях или Min итоговый запрос в запрос на добавление и добавьте записи в таблицу основных значений. Инструкции по выполнению этого действия описаны в этих разделах.

    1. Создайте запросы на поиск наибольших и наименьших значений. Шаги, необходимые для создания запроса на поиск наибольших или наименьших значения, описаны выше в разделе Поиск самой последней или самой давней даты. Если нужно сгруппировать записи по категориям, обратитесь к разделу Поиск самых последних или самых давних дат для записей в категории или группе. Если используются таблицы примеров из предыдущего раздела, используйте только данные из таблицы "Мероприятия". Используйте в обоих запросах поля "Тип мероприятия", "Клиент" и "Дата мероприятия" из таблицы "Мероприятия".
    2. Сохраните оба запроса, присвоив им описательные имена, например "Наибольшее значение" и "Наименьшее значение", и оставьте их открытыми для использования на следующих этапах.

Создание запроса на создание таблицы

  1. Открыв запрос к максимальным значениям в Конструкторе: на вкладке "Конструктор запросов " в группе "Тип запроса " нажмите кнопку "Создать таблицу". Откроется диалоговое окно Создание таблицы.
  2. В поле Имя таблицы введите имя таблицы, которая будет хранить записи с наибольшими и наименьшими значениями. Например, введите Top and Bottom Records, а затем нажмите кнопку ОК. Каждый раз при выполнении запроса вместо отображения результатов в режиме таблицы запрос будет создавать таблицу и замещать значения текущими данными.
  3. Сохраните и закройте запрос.

Создание запроса на добавление

  1. Запрос с наименьшим значением в Конструкторе: на вкладке "Конструктор запросов " в группе "Тип запроса " нажмите кнопку "Добавить".
  2. Откроется диалоговое окно Добавление.
  3. Введите то же имя, которое вы указали в диалоговом окне Создание таблицы. Например, введите Top and Bottom Records, а затем нажмите кнопку ОК. Каждый раз при выполнении запроса записи добавляются в таблицу Top and Bottom Records вместо отображения его результатов в режиме таблицы.
  4. Сохраните и закройте запрос.

Выполнение запросов

  • Теперь вы готовы выполнить два запроса. В области навигации дважды щелкните запрос с первым значением и выберите "Да " в ответ на запрос. Затем дважды щелкните запрос "Наименьшее значение " и выберите "Да " в ответ на запрос.
  • Откройте таблицу "Последние и верхние записи " в режиме таблицы.

Важно

Если при попытке выполнения запроса на создание или добавление ничего не происходит, проверьте, не появляется ли в строке состояния Access следующее сообщение:

Данное действие или событие заблокировано в режиме отключения.

Если выводится это сообщение, сделайте следующее:

  • Выберите "Включить это содержимое", а затем нажмите кнопку "ОК".
  • Выполните запрос еще раз.

К началу страницы