#sql #ms-access
#sql #ms-access
Вопрос:
Нужна помощь в определении того, как использовать функцию LAST, чтобы сузить мой запрос к базе данных до последней записи с определенными фильтрами.
Я работаю в MS Access для тестирования запросов.
Вопрос: Я пытаюсь отфильтровать свою базу данных с помощью простого запроса, чтобы сузить мои данные только до элементов, которые соответствуют определенному WorkOrder
и Run
.
Код:
SELECT *
FROM DataPoints
WHERE (((DataPoints.[WorkOrder])=[WO2]) AND ((DataPoints.[RunNumber])=6))
Приведенный выше код отлично работает. Далее, я хочу получить только данные из последней записи. Я считаю, что мне нужно включить LAST()
функцию, но не могу понять, как.
Идеи? Я был бы признателен. Спасибо.
.
Комментарии:
1. Как вы узнаете, какая запись является последней? Вероятно, было бы полезно, если бы вы могли поделиться образцами данных и ожидаемым результатом.
2. Я надеюсь использовать последнюю версию среды выполнения. Извините, я должен был включить это раньше. Я добавил ссылку на фрагмент базы данных.
Ответ №1:
Вы могли бы упорядочить результаты по полям даты и времени и выбрать только верхний 1, например:
select top 1 t.*
from datapoints t
where t.workorder = [WO2] and t.runnumber = 6
order by t.rundate desc, t.runtime desc
Ответ №2:
Вы могли бы использовать коррелированный подзапрос с NOT EXISTS
условием для фильтрации только последней записи, например:
SELECT dp.*
FROM DataPoints AS dp
WHERE (
((dp.[WorkOrder])=[WO2])
AND ((dp.[RunNumber])=6)
AND (
NOT EXISTS(
SELECT 1
FROM DataPoints AS dp1
WHERE (
((dp1.[WorkOrder]) = (dp.[WorkOrder]))
AND ((dp1.[RunNumber]) = (dp1.[RunNumber]))
AND ((dp1.[RunTime]) > (dp.[RunTime]))
)
)
)
)
Комментарии:
1. Спасибо GMB. Этот код работает хорошо. Хотя я не использую ее для этой конкретной проблемы, на самом деле она отвечает на большой вопрос, который у меня возникает в дальнейшем.
Ответ №3:
Если вы сможете включить уникальный ключ для идентификации записи с помощью LAST()
функции, это действительно упростит задачу.
Приведенный мной пример показывает, как бы вы это сделали, если бы хотели по-прежнему использовать LAST()
функцию. Для того, чтобы мой пример работал, я создал первичный ключ в вашей DataPoints
таблице и назвал его PrimaryWO_Key
.
Первое: Создайте запрос для получения уникального ключа для последней вставленной / созданной записи. В моем примере я назвал этот запрос Last_WorkOrderPrimaryKey
.
Второе: Создайте свой запрос результатов, чтобы использовать запрос, который мы только что создали. Я назвал этот запрос «Последняя запись рабочего задания».
Любой сохраненный запрос в Access можно использовать так, как если бы это была «Фактическая» таблица.
Комментарии:
1. Остерегайтесь использования
first
orlast
для неупорядоченного набора данных, поскольку безorder by
предложения вы не можете полагаться на порядок, в котором записи будут обслуживаться при выполнении запроса — это отмечено в документации . Кроме того, зачем использовать декартово произведение над внутренним соединением?2. Я лично не стал бы использовать эту функцию таким образом, хотя я разработал ответ на вопрос и использовал функцию Last. При работе с одной таблицей данных в ACCESS это всегда будет работать. Если бы это включало больше таблиц, было бы необходимо предложение ORDER BY .
3. Также … поскольку наш сохраненный запрос возвращает одну строку, не было необходимости объединять таблицы, но они работали бы одинаково. Я обнаружил, что способ, которым я работаю в ACCESS, сильно отличается от того, как я работаю в Oracle, и отказ от объединения этих таблиц — это всего лишь один пример.
4. Спасибо, это очень полезно! Я пошел дальше и отказался от последней функции, как было предложено, и использовал решение Lee Mac с первичными ключами.