Найдите последнюю запись

#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 лет назад.