У меня есть база данных Access, содержащая таблицу с информацией о частях, которые мы сортируем. Эта таблица имеет поле идентификатора автонумерации и идентификатор 110ID, который ссылается на другую таблицу с информацией о детали. Он также содержит sortDate, sortShift, отсортировано, утилизировано и отремонтировано. Мне нужно найти, сколько деталей было отсортировано с момента обнаружения последнего дефекта (ни одного бракованного или отремонтированного) для каждого 110ID.
Проблема в том, что я не могу гарантировать, что информация будет занесена в базу данных в хронологическом порядке. Поэтому мне нужно суммировать поле «отсортировано» для любых записей, у которых «sortDate» больше, чем последний дефект, или «sortDate» такой же, как последний дефект, но больше «sortShift», или использовать идентификатор автономера в качестве последнего средства если совпадают и sortDate, и sortShift.
Это запрос, который я сейчас использую:
SELECT SortInfo.[110ID], Sum(SortInfo.Sorted) AS SumOfSorted
FROM SortInfo
WHERE (
((SortInfo.sortdate)>(select top 1 dupe.sortdate from sortinfo as dupe where (((dupe.[110id])=(sortinfo.[110id])) and (((dupe.repaired)<>0) or ((dupe.scrapped)<>0))) order by dupe.sortdate desc, dupe.sortshift desc, dupe.id desc)))
OR (((SortInfo.sortdate)=(select top 1 dupe.sortdate from sortinfo as dupe where (((dupe.[110id])=(sortinfo.[110id])) and (((dupe.repaired)<>0) or ((dupe.scrapped)<>0))) order by dupe.sortdate desc, dupe.sortshift desc, dupe.id desc))
AND ((SortInfo.sortshift)>(select top 1 dupe.sortshift from sortinfo as dupe where (((dupe.[110id])=(sortinfo.[110id])) and (((dupe.repaired)<>0) or ((dupe.scrapped)<>0))) order by dupe.sortdate desc, dupe.sortshift desc, dupe.id desc)))
OR (((SortInfo.sortdate)=(select top 1 dupe.sortdate from sortinfo as dupe where (((dupe.[110id])=(sortinfo.[110id])) and (((dupe.repaired)<>0) or ((dupe.scrapped)<>0))) order by dupe.sortdate desc, dupe.sortshift desc, dupe.id desc))
AND ((SortInfo.sortshift)=(select top 1 dupe.sortshift from sortinfo as dupe where (((dupe.[110id])=(sortinfo.[110id])) and (((dupe.repaired)<>0) or ((dupe.scrapped)<>0))) order by dupe.sortdate desc, dupe.sortshift desc, dupe.id desc))
AND ((SortInfo.ID)>(select top 1 dupe.id from sortinfo as dupe where (((dupe.[110id])=(sortinfo.[110id])) and (((dupe.repaired)<>0) or ((dupe.scrapped)<>0))) order by dupe.sortdate desc, dupe.sortshift desc, dupe.id desc))
)
GROUP BY SortInfo.[110ID];
Проблема в том, что это очень медленно. Есть ли лучший способ сделать это, который даст лучшую производительность?