#sql #ms-access
Вопрос:
В MS Access у меня есть таблица списка дат, в которой указаны сроки выполнения различных заказов. Таким образом, таблица состоит из двух столбцов: OrderNo и DueDate. Для некоторых номеров заказов может быть несколько дат. Таблица может выглядеть следующим образом:
OrderNo DueDate
100 12/9/2021
101 20/9/2021
102 30/9/2021
100 7/10/2021
102 11/10/2021
103 15/10/2021
…
Моя цель-написать запрос для получения последней даты каждого заказа.
Я создал два запроса; первый, qry1, для создания списка ОрдНо без дублирования:
SELECT
DateList.OrderNo AS UniqOrderNo
FROM DateList
GROUPBY DateList.OrderNo;
во втором запросе, qry2, я использовал функцию DMax для поиска по датам каждого заказа максимального значения.
SELECT
qry1.UniqOrderNo
,DMax("[DueDate]","[DateList]","[OrderNo]='[qry1]![UniqOrderNo]'") AS LatDuDate
FROM qry1
INNER JOIN DateList
ON qry1.UniqOrderNo = DateList.OrderNo;
Латдудат представляет собой последний дуедат Ордена.
Запрос, к сожалению, не работает и ничего не возвращает.
Теперь мои вопросы:
Есть ли что-то неправильное в моем подходе / запросах?
Есть ли лучший способ выполнить эту задачу в MS Access?
Ответ №1:
Ты почти сам это понял. Макс возвращает вам самую большую ценность группы.
SELECT Max(DueDate) DueDate, OrderNo
FROM DateList
GROUP BY OrderNo
Ответ №2:
Похоже на ответ Кристиана, но так OrderNo
как это уникальный идентификатор, вы можете просто выбрать First()
вместо группировки — это работает лучше. **
Конечно, это зависит от количества записей, содержащихся в таблице.
SELECT First(OrderNo) AS OrderNo, Max(DueDate) AS DueDate
FROM DateList;
** Источник: Аллен Браун — Оптимизация запросов
Комментарии:
1. First () — очень ненадежная функция в общем использовании. В этом сценарии все работает так, как ожидалось, но не всегда. Хотя в целом я бы не осмелился подвергнуть сомнению совет Аллена Брауна — я думаю, вы обнаружите, что текущая версия Access database engine обрабатывает сгруппированные запросы гораздо эффективнее, чем это было 15-20 лет назад.