查找特定项目的最新订单

时间:2010-03-29 14:29:16

标签: sql db2

我正在尝试为DB2 Version 8编写SQL查询,该查询检索用户列表的特定部分的最新顺序。查询接收一个参数,该参数包含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 Version 8不支持SQL“TOP”函数。

1 个答案:

答案 0 :(得分:0)

尝试以下方法。我没有测试它。我们的想法是,您首先找到所有指定客户的所有订单。这些将被分组,您可以找到每个客户的最大订购时间(group by和max的组合)。这是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