Поиск Max Date и возврат элемента max date вместе с другими полями для этой записи - PullRequest
0 голосов
/ 04 мая 2018

У меня есть три таблицы:

  • WorkOrder, содержащий все рабочие задания, выполненные в MaintItems (MaintItem будет встречаться несколько раз в таблице WorkOrder)

  • MaintItems, который содержит список уникальных MaintItems,

  • LastOccu для хранения сведений о последнем вхождении из таблицы WorkOrder объекта MaintItem.

Чтобы определить последнюю дату выполнения MaintItem и заполнить таблицу LastOccu значениями MaxDate и MaintItem, все работает правильно. Проблема, с которой я сталкиваюсь, заключается в том, что когда я хочу обновить таблицу lastOccu дополнительным полем Номер WorkOrder, запрос возвращает все WorkOrders для этого MaintItem.

Пример таблицы WorkOrder:

WorkOrder MaintItem   RefDate     Reading
1         101         2018/01/30  200
2         103         2018/02/03  1200
3         101         2018/02/04  230

Требуется результат таблицы LastOccu:

MaintItem MaxDate    WONumber Reading
101       2018/01/30 3        230
103       2018/02/03 2        1200

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

INSERT INTO LastOccu ( MaintItem, MaxDate, WONumber, ReadingNo )
SELECT MD.MaintItem, MD.MaxRefDate, MD.WONumber, MD.ReadingNo
FROM 
(SELECT MI.MaintItem, MAX(WO.RefDate) AS MaxRefDate, WO.WONumber,
WO.ReadingNo FROM MaintItem AS MI INNER JOIN WorkOrder AS WO ON 
MI.MaintItem = WO.MaintItem WHERE WO.RefDate is not null GROUP BY
MI.MaintItem, WO.WONumber, WO.ReadingNo)  AS MD;

Также обратите внимание, что я использую MS Access

Помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Один из способов сделать это - использовать коррелированный подзапрос:

INSERT INTO LastOccu ( MaintItem, MaxDate, WONumber, ReadingNo )
    SELECT MD.MaintItem, MD.MaxRefDate, MD.WONumber, MD.ReadingNo
    FROM WorkOrder as wo INNER JOIN
         MaintItem as mi
         ON mi.MaintItem = wo.MaintItem
    WHERE wo.RefDate = (SELECT MAX(wo2.RefDate)
                        FROM WorkOrder as wo2
                        WHERE wo2.MaintItem = wo.MaintItem
                       );

Фильтрация на NULL не важна, поскольку значения NULL не будут проходить через фильтр.

0 голосов
/ 04 мая 2018

Не вижу необходимости объединяться с таблицей MaintItem. У каждого рабочего заказа уже должна быть соответствующая запись MaintItem, нет? Если нет, то присоединяйтесь (это WorkOrder или WONumber, я не мог понять).

INSERT INTO LastOccu(MaintItem, MaxDate, WONumber, ReadingNo)
SELECT wo.MaintItem, wo.RefDate, wo.Workorder, wo.ReadingNo
FROM WorkOrder wo
     INNER JOIN(
               SELECT MaintItem, MAX(RefDate) AS MaxRefDate
               FROM WorkOrder
               WHERE RefDate IS NOT NULL
               GROUP BY MaintItem
               ) AS MD ON wo.MaintItem=MD.MaintItem
                      AND wo.RefDate=MD.MaxRefDate;

Примечание. К сожалению, я пропустил изменение тега с сервера sql на MSAccess. Это не поддерживает ANSI SQL, но, по крайней мере, должно поддерживать такие простые, которые я предполагаю, поэтому не удаляю (Ваш пример выходных данных, похоже, не верен, если в этом может быть логика?).

EDIT:

INSERT INTO LastOccu(MaintItem, MaxDate, WONumber, ReadingNo)
SELECT wo.MaintItem, wo.RefDate, wo.Workorder, wo.ReadingNo
FROM WorkOrder wo
     INNER JOIN(
               SELECT MaintItem, MAX(RefDate) AS MaxRefDate
               FROM WorkOrder
               WHERE RefDate IS NOT NULL
               GROUP BY MaintItem
               ) AS MD ON wo.MaintItem=MD.MaintItem
                      AND wo.RefDate=MD.MaxRefDate
    where MaintItem in (Select MaintItem from MaintItem);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...