2010-05-07 26 views
2

这里是我的表CusOrder收集客户订单选择3最新的顺序为每个客户

OrderID  Cus_ID Product_ID NumberOrder  OrderDate 
    1  0000000001  9   1  6/5/2553 0:00:00 
    2  0000000001  10   1  6/5/2553 0:00:00 
    3  0000000004  9   2  13/4/2553 0:00:00 
    4  0000000004  9   1  17/3/2553 0:00:00 
    5  0000000002  9   1  22/1/2553 0:00:00 
    7  0000000005  9   1  16/12/2552 0:00:00 
    8  0000000003  9   3  13/12/2552 0:00:00 
    10  0000000001  9   2  19/11/2552 0:00:00 
    11  0000000003  9   2  10/11/2552 0:00:00 
    12  0000000002  9   1  23/11/2552 0:00:00 

,我需要选择3最新的顺序为每一个客户,我需要所有的客户 所以它会显示每个客户和他的/她的3最新的顺序 我怎么能做到这一点

对不起我的英文不好

回答

0
WITH Temp AS 
(
    SELECT *, (ROW_NUMBER() OVER (PARTITION BY Cus_ID ORDER BY OrderDate DESC)) AS Number 
    FROM CusOrder 
) 
SELECT * FROM Temp WHERE Number <= 3 

应该工作。没有测试这个确切的数据库结构,但类似的东西。

+0

看起来更容易阅读谢谢 – Ratiug 2010-05-07 20:47:54

2

这CTE应该为你工作:

;with cteTop3PerGroup as 
(
    select row_number() over(partition by Cus_ID order by OrderDate DESC) as RN 
      , * 
    from CusOrder 
) 
select * from cteTop3PerGroup 
where RN <= 3 
+0

谢谢!它的工作 – Ratiug 2010-05-07 18:35:23

+0

有趣的是,在实际尝试之前,我想我可以不用公共表格表达。 T-SQL虽然很琐碎......但奇怪的是,你的帖子直到完成后才显示出来。 – Thorarin 2010-05-07 18:41:36

0

“Pure”SQL解决方案。


With Customers As (
    Select Cus_ID From test Group By Cus_ID 
    ), 
TopLastOrders as (
    Select o.Cus_ID, Max(OrderDate) as OrderDate 
    From test o Inner Join Customers c on c.Cus_ID = o.Cus_ID 
    Group By o.Cus_ID 
    ), 
TopSecondOrders as (
    Select o.Cus_ID, Max(OrderDate) as OrderDate 
    From test o Inner Join Customers c on c.Cus_ID = o.Cus_ID 
    Where Not Exists (Select 1 From TopLastOrders Where Cus_ID=o.Cus_ID And OrderDate=o.OrderDate) 
    Group By o.Cus_ID 
    ), 
TopThirdOrders as (
    Select o.Cus_ID, Max(OrderDate) as OrderDate 
    From test o Inner Join Customers c on c.Cus_ID = o.Cus_ID 
    Where Not Exists (Select 1 From TopLastOrders Where Cus_ID=o.Cus_ID And OrderDate=o.OrderDate) 
     And Not Exists (Select 1 From TopSecondOrders Where Cus_ID=o.Cus_ID And OrderDate=o.OrderDate) 
    Group By o.Cus_ID 
    )

Select c.Cus_ID, t1.OrderDate, t2.OrderDate, t3.OrderDate From Customers c
Left Outer Join TopLastOrders t1 on t1.Cus_ID = c.Cus_ID Left Outer Join TopLastOrders t2 on t2.Cus_ID = c.Cus_ID Left Outer Join TopLastOrders t3 on t3.Cus_ID = c.Cus_ID

Order By c.Cus_ID

我不知道你需要什么输出,但这个应该不难。

+0

这是另一种解决方案,当我不使用SQL Server 2005时可以使用是的? 抱歉我的英文不好 – Ratiug 2010-05-07 20:54:06

相关问题