2010-05-07 6 views
2

Voici ma table CusOrder qui recueille le client pourSélectionnez 3 lastest pour que chaque client

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 

je dois sélectionner 3 pour lastest pour chaque client et je dois tous les clients il montrera chaque client et son/ses 3 lastest pour comment puis-je faire

désolé pour mon mauvais anglais

Répondre

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 

Devrait fonctionner. Non testé avec cette structure de base de données exacte, mais quelque chose de similaire.

+0

Il est plus facile à lire merci – Ratiug

2

Ce CTE devrait travailler pour vous:

;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

Merci! c'est du travail – Ratiug

+0

Drôle, et avant de l'essayer, je pensais pouvoir me passer de l'expression de la table commune. T-SQL était en train d'être salope ... Bizarrement, votre message ne s'est pas affiché avant que j'aie fini. – Thorarin

0

Solution SQL "pure".


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

Je ne suis pas sûr de ce que la sortie dont vous avez besoin, mais cela ne devrait pas être difficile.

+0

Voilà une autre solution est à utiliser lorsque je n'utilise pas SQL Server 2005 Oui? désolé pour mon mauvais anglais – Ratiug

Questions connexes