Выберите 3 последних заказа для каждого клиента - PullRequest
2 голосов
/ 07 мая 2010

Вот мой стол CusOrder, который собирает заказ клиента

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 последним заказам, какмогу ли я сделать это

извините за мой плохой английский

Ответы [ 3 ]

2 голосов
/ 07 мая 2010

Этот 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 голосов
/ 07 мая 2010

«Чистое» решение 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
    )</p>

<p>Select 
    c.Cus_ID,
    t1.OrderDate,
    t2.OrderDate,
    t3.OrderDate
From 
    Customers c<br>
        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</p>

<p>Order By
    c.Cus_ID

Я не уверен, какой вывод вам нужен, но это не должно быть сложно.

0 голосов
/ 07 мая 2010
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

Должно работать. Не проверено с такой точной структурой базы данных, но что-то похожее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...