Нахождение самого последнего заказа для определенного элемента - PullRequest
0 голосов
/ 29 марта 2010

Я пытаюсь написать запрос SQL для DB2 Версии 8, который извлекает самый последний порядок определенной части для списка пользователей. Запрос получает параметр, который содержит список номеров customerId и номера partId. Например,

Таблица заказов

OrderID
PartID
CustomerID
OrderTime

Я изначально хотел попробовать:

Select * from Order
where
    OrderId = (

        Select orderId
        from Order
        where 
        partId = #requestedPartId# and customerId = #customerId#
        Order by orderTime desc
        fetch first 1 rows only
    );

Проблема с вышеприведенным запросом заключается в том, что он работает только для одного пользователя, и мой запрос должен включать несколько пользователей.

У кого-нибудь есть предложения о том, как можно расширить вышеуказанный запрос для работы с несколькими пользователями? Если я уберу свой «извлечь только первые 1 строки», он вернет все строки вместо самых последних. Я также попытался использовать Max (OrderTime), но не смог найти способ вернуть OrderId из суб-выбора.

Спасибо!

Примечание: DB2 Версии 8 не поддерживает функцию SQL "TOP".

1 Ответ

0 голосов
/ 29 марта 2010

Попробуйте следующее. Я не проверял это. Идея состоит в том, что вы сначала найдете все заказы для всех указанных вами клиентов. Они будут сгруппированы, и вы найдете наибольшее время заказа для каждого клиента (сочетание групп по и макс.). Это запрос foo, который определяет записи, которые вам нужны. Затем вы присоединитесь к таблице заказов, чтобы получить необходимую информацию для этих заказов.

select o.*
from order o inner join 
    (select customerId, max(orderTime)
    from order o
    where customerId in ( #customerIds#)
      and partId = #requestedPartId#
    group by customerId) foo
    on o.customerId = foo.customerId 
     and o.orderTime = foo.orderTime

РЕДАКТИРОВАТЬ: Приведенный выше запрос дает вам самый последний заказ для каждого клиента, указанного вами при условии, что существует только один заказ на клиента и orderTime. Чтобы получить только один заказ, это немного отличается. В следующем примере предполагается, что orderTime уникален, то есть в базе данных нет двух заказов одновременно. Обычно это так, если orderTime записывается в миллисекундах.

select o.*
from order o inner join 
    (select customerId, max(orderTime)
    from order o
    where customerId in ( #customerIds#)
      and partId = #requestedPartId#) foo
     on o.orderTime = foo.orderTime
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...