SQL - 仅为之前订购的每个客户选择最后一个订单

时间:2013-11-09 00:32:41

标签: sql sql-server-2008

有2个表,我想只为之前订购的每个客户选择最后一个订单...

(cid,cname)客户表

1,大卫

2,汤姆

3,Alex

(oid,cid,title或ordertime)订单表

1,1, “T恤”,2013年10月1日

2,3, “球”,2013年10月1日

3,3, “食品”,2013年11月20日

*根据汤姆从未订购过的表格。所以他不会被列入名单。亚历克斯之前订购过2次,我只想显示最后一个订单。

输出必须如下:*

1,1,“T恤”,2013-10-1,大卫

<3> 3,3,“食物”,2013-11-20,Alex

我尝试了类似这样的代码,但Alex被列入了2次。我不明白我怎么能搞清楚。

select * 
from   Clients t2 
  left join Orders t1 
  on t1.cid=t2.cid 
where t1.ordertime<getutcdate() 
order by t1.ordertime desc**

可能我必须使用Distinct或Group by但我不明白如何。

3 个答案:

答案 0 :(得分:0)

Select
    x.oid, 
    x.cid, 
    x.title, 
    x.ordertime,
    x.cname
From (
    Select
        o.oid, 
        o.cid, 
        o.title, 
        o.ordertime,
        c.cname,
        row_number() over (partition by o.cid order by o.ordertime desc) rn
    From
        Clients c
            inner join
        Orders o
            on c.cid = o.cid
    ) x
Where
    x.rn = 1

答案 1 :(得分:0)

SELECT o.*, c.name
FROM orders o INNER JOIN clients c on o.cid = c.cid 
INNER JOIN (SELECT MAX(oid) as latestOrderid, cid FROM orders GROUP BY  cid) as latest
on latest.latestorderid= orders.oid

答案 2 :(得分:0)

试试这个:

select o.*, c.cname
from clients c
join orders o on 
    c.cid = o.cid 
    and not exists (select * 
                    from orders o2 
                    where o2.cid = o.cid 
                        and o2.ordertime > o.ordertime)