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

Sql DB2:检索给定表中每个客户的最新订单?,sql,db2,Sql,Db2,我在DB2中有Customer和Order表,我需要一个select查询来检索表中每个客户的最新订单详细信息 因此,查询将返回Customer表中的所有客户以及最新订单的详细信息,比如说Customer下的订单id可以有许多订单,您有什么想法 订单表有一个带有下订单时间的时间戳列 大概是这样的: SELECT customer.name, order.order_id FROM customer, order WHERE customer.customer_id=order.customer_i

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

因此,查询将返回Customer表中的所有客户以及最新订单的详细信息,比如说Customer下的订单id可以有许多订单,您有什么想法

订单表有一个带有下订单时间的时间戳列

大概是这样的:

SELECT customer.name, order.order_id
FROM customer, order
WHERE customer.customer_id=order.customer_id
AND order.ordertime is newest 
非常感谢

更新:为了让我的问题更清楚一点,我希望为每个客户返回一行,其中包含该客户最新订单的详细信息

可以使用join解决 Customer_id是Customer表中的主键,在order表中用于识别下订单的客户。 Date是包含下订单日期的列 如果您可以提供表结构,我可以为您的结构编写正确的查询

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
 )

试试这个。这在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

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

select   customer_id, max(ordertime)
from     order
group by customer_id
但是,通过这么简单的查询,您无法返回所有其他字段。现在,您需要将这些结果重新连接到order表,以获得所需的结果

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
试试这个:

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
        )


这个查询不会返回所有订单;不仅是每个客户的最新订单?此查询是否会为每个客户返回一行,而不管他们有多少订单,或者根据与客户相关联的订单数量选择几行?fetch first 1将只提供一行这将为每个客户提取第一行还是为整个查询提取第一行?我正在为每个客户寻找一行。因此,对于customer表中的每个客户,查询都会为该客户返回一行,其中包含该客户下的最新订单的详细信息。您应该添加限定最新订单日期时间列的信息,等等。对不起,orders表中有一个timestamp列。每个人都在尝试给他一个查询,该查询只会告诉他最近的订单日期。正如博文所述,我们的目标是从最近的订单中获取详细信息。@Sean我最初忘记在回答中包含客户名称,但现在更新为客户名称……假设一个客户有3个订单。一个在1号,一个在2号,一个在3号。第三个上的一个将大于第一个和第二个上的一个,第二个上的一个将大于第一个上的一个,并且您将得到该客户的三个记录。也许我遗漏了您查询的一些内容,但这就是我第一眼看到的情况……仔细看一看:你遗漏了一个where子句。想想o2.customer_id何时为空。不要使用隐式连接语法,它被视为反模式。除此之外,DB2还有一个异常连接,它相当于左连接。。。其中为空位。否则,我认为这应该行得通。@MostyMostacho是的,我注意到第一次评论后的where,因此第二次评论是自我怀疑。这是可行的,但除了X-Zero刚才指出的,而且当下一个人来看它时,这可能很难理解,你只是返回订单日期,而不是订单的所有细节。您可以考虑将S.OrthyId更改为S.*,您检查了该解决方案的执行计划吗?这看起来更接近于基于游标的方法,因为它为每个客户运行一个子查询。至少,我认为,因为子查询的where条件不断变化,所以它必须改变。如果我错了,有人会纠正我……我不会使用select来创建表,而是将该查询放在WITH中。@phanneman他没有使用SQL Server。我怀疑db2是否支持CTE,否则这将是一个好建议。DB2forLinux、UNIX和Windows从1998年发布的V5开始就支持公共表表达式!