Возможно ли объединить функцию SELECT с ПОСЛЕДНЕЙ функцией в SQL?

#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 or last для неупорядоченного набора данных, поскольку без order by предложения вы не можете полагаться на порядок, в котором записи будут обслуживаться при выполнении запроса — это отмечено в документации . Кроме того, зачем использовать декартово произведение над внутренним соединением?

2. Я лично не стал бы использовать эту функцию таким образом, хотя я разработал ответ на вопрос и использовал функцию Last. При работе с одной таблицей данных в ACCESS это всегда будет работать. Если бы это включало больше таблиц, было бы необходимо предложение ORDER BY .

3. Также … поскольку наш сохраненный запрос возвращает одну строку, не было необходимости объединять таблицы, но они работали бы одинаково. Я обнаружил, что способ, которым я работаю в ACCESS, сильно отличается от того, как я работаю в Oracle, и отказ от объединения этих таблиц — это всего лишь один пример.

4. Спасибо, это очень полезно! Я пошел дальше и отказался от последней функции, как было предложено, и использовал решение Lee Mac с первичными ключами.