DB2:检索给定表中每个客户的最新订单?

时间:2012-02-20 16:18:02

标签: sql db2

我在DB2中有Customer和Order表,我想要一个select查询来检索表中每个客户的最新订单详细信息。

所以查询将返回Customer表中的所有客户以及客户放置的最新订单的详细信息(比如说order_id)(客户可以有很多订单),关于最佳方式的任何想法?

订单表有一个时间戳列,其中包含下订单的时间。

这样的事情:

SELECT customer.name, order.order_id
FROM customer, order
WHERE customer.customer_id=order.customer_id
AND order.ordertime is newest 

非常感谢。

更新:为了让我的问题更加清晰,我想为每个客户返回一行,其中包含该客户的最新订单(单笔订单)的详细信息。

4 个答案:

答案 0 :(得分:2)

首先按客户分组并选择最大订单日期:

select   customer_id, max(ordertime)
from     order
group by customer_id

尽管如此,您无法通过查询返回所有其他字段。您现在需要再次将这些结果重新加入订单表,以获得您想要的结果。

select  c.name, o.*
from    customer c join 
        order o on c.customer_id = o.customer_id join
(
    select   customer_id, max(ordertime) ordertime
    from     order
    group by customer_id
) RecentOrders on o.customer_id = RecentOrders.customer_id and 
                  o.ordertime = RecentOrders.ordertime

答案 1 :(得分:0)

可以使用join解决 Customer_id是customer表中的主键,在订单表中用于识别下订单的客户。 日期是具有订单所在日期的列 (如果你可以提供表结构,我可以为你的结构编写正确的查询)

SELECT customer_id,order_id
FROM (
Select o.customer_id,o.order_id,max(o.order_date)
FROM Customer c
inner join Orders o
ON o.customer_id=c.customer_id
GROUP BY o.customer_id,o.order_id
 )

答案 2 :(得分:0)

试试这个。这适用于MySQL,不确定MySQL和DB2之间的语法差异:(

select c.name, s.* from (
    select o1.customer_id, o1.order_id from order o1
    left join order o2
    on o1.customer_id = o2.customer_id and o1.ordertime < o2.ordertime
    where o2.customer_id is null
) as S
join customers c on c.customer_id = s.customer_id

答案 3 :(得分:0)

试试这个:

SELECT Customer1.Name, Order1.order_id
    FROM Customer Customer1, Order Order1 
    WHERE Customer1.customer_id = Order1.customer_id 
    AND Order1.LASTUPDATETIME = (
        SELECT MAX(Order2.LASTUPDATETIME)
            FROM Order Order2 
            WHERE Order2.customer_id=Order1.customer_id
        )