Выбор ближайшей даты из списка записей

#ms-access

Вопрос:

введите описание изображения здесь

введите описание изображения здесь привет всем,

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

Столбцы 1-7 взяты из одной таблицы, столбцы 8-13-из другой.

Как вы можете видеть, у меня есть две записи для идентификатора 1. Это связано с тем, что во 2-й таблице есть две записи, относящиеся к сотруднику 693.

Мне всегда нужна только одна запись на идентификатор, критерий заключается в том, что результат, используемый из второй таблицы, должен быть тем, у которого поле DateUpdated (меньше или равно) и ближе всего к дате транзакции в столбце 7.

Есть какие-нибудь идеи о том, как мне это сделать?

ОБНОВЛЕНИЕ* Хорошо, благодаря первому предложению, моя таблица результатов теперь выглядит как 2-я картинка. У меня есть столбец, в котором показаны различия между двумя датами. Итак, как мне теперь получить результаты, чтобы показывать только строку с наименьшим числом для каждого идентификатора?

Обновить***

кр.

Крис

Ответ №1:

Используйте агрегирующий запрос с:

 Min(Abs(DateDiff("d", [Transaction], [Date Updated]))) As NearestUpdateDate
 

и Сгруппируйте По оставшимся полям.

Все могло бы пойти вот так:

 SELECT 
    tblEmployee.Id, 
    tblEmployee.EmployeeId, 
    tblEmployee.Transaction, 
    Min(Abs(DateDiff("d",[Transaction],[Date Updated]))) AS MinDiff
FROM 
    tblEmployee 
INNER JOIN 
    tblEmployeeWages ON 
        tblEmployee.EmployeeId = tblEmployeeWages.EmployeeId
GROUP BY 
    tblEmployee.Id, 
    tblEmployee.EmployeeId, 
    tblEmployee.Transaction;
 

Сохраните это как qdyEmployeeDate . Затем используйте это:

 SELECT 
    tblEmployee.Id, 
    tblEmployee.EmployeeId, 
    tblEmployee.Transaction, 
    Min(tblEmployeeWages.[Date Updated]) AS DateUpdated
FROM 
    (tblEmployee 
INNER JOIN 
    qdyEmployeeDate ON 
        tblEmployee.Id = qdyEmployeeDate.Id) 
INNER JOIN 
    tblEmployeeWages ON 
        tblEmployee.EmployeeId = tblEmployeeWages.EmployeeId
WHERE 
    (tblEmployee.Transaction = DateAdd("d",[MinDiff],[Date Updated])) 
    OR 
    (tblEmployee.Transaction=DateAdd("d",-[MinDiff],[Date Updated]))
GROUP BY 
    tblEmployee.Id, 
    tblEmployee.EmployeeId, 
    tblEmployee.Transaction;
 

получить:

введите описание изображения здесь

Теперь у вас есть идентификаторы и две даты для использования. Этот запрос вы можете использовать в новом запросе с внешними соединениями с таблицами для извлечения оставшихся полей.

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

Комментарии:

1. Это просто дало бы мне разницу между датами, верно? Тогда как бы я отображал только строки с самой низкой датой? Когда я использую этот метод, в столбце 13 просто отображаются различия между двумя датами. Он не показывает только запись с наименьшей разницей?

2. Большое спасибо за вашу помощь. Из этих примеров я получил рабочее решение.