Можно ли совместить функцию SELECT с функцией LAST в SQL? - PullRequest
3 голосов
/ 27 марта 2019

Нужна помощь в выяснении, как использовать функцию LAST, чтобы сузить мой запрос к базе данных до последней записи с определенными фильтрами.

Я работаю в MS Access для проверки запросов.

Вопрос: Я пытаюсь отфильтровать базу данных с помощью простого запроса, чтобы сузить мои данные до элементов, которые соответствуют конкретному WorkOrder и Run.

Код:

SELECT *
FROM DataPoints
WHERE (((DataPoints.[WorkOrder])=[WO2]) AND ((DataPoints.[RunNumber])=6))

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

Идеи?Буду премного благодарен.Спасибо.

Sample data snippet.

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

Вы можете упорядочить результаты по полям даты и времени и выбрать только первые 1, например:

select top 1 t.*
from datapoints t
where t.workorder = [WO2] and t.runnumber = 6
order by t.rundate desc, t.runtime desc
1 голос
/ 28 марта 2019

Если вы сможете включить уникальный ключ для идентификации записи с помощью функции LAST(), это сделает это действительно просто.

Приведенный мною пример показывает, как вы это сделаете, если хотите использовать функцию LAST(). Чтобы мой пример работал, я создал первичный ключ в вашей таблице DataPoints и назвал его PrimaryWO_Key.

Первый : создание запроса для получения уникального ключа для последней вставленной / созданной записи. В моем примере я назвал этот запрос Last_WorkOrderPrimaryKey.

Второй : создайте свой запрос результатов, чтобы использовать только что созданный запрос. Я назвал этот запрос «Последняя запись заказа на работу».

Любой сохраненный запрос в Access можно использовать, как если бы он был «фактической» таблицей.

enter image description here

enter image description here

1 голос
/ 28 марта 2019

Вы можете использовать коррелированный подзапрос с условием 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]))
            )
        )
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...