Проблема подзапроса SQL с группировкой, средняя - PullRequest
4 голосов
/ 30 сентября 2008

В MS Transact SQL, скажем, у меня есть таблица (Orders), подобная этой:

 Order Date       Order Total     Customer #
 09/30/2008       8.00            1
 09/15/2008       6.00            1
 09/01/2008       9.50            1
 09/01/2008       1.45            2
 09/16/2008       4.50            2
 09/17/2008       8.75            3
 09/18/2008       2.50            3

Из этого мне нужно следующее: для каждого клиента средняя сумма заказа для двух последних заказов. Так что для клиента № 1 я должен получить 7,00 (а не 7,83).

Я смотрю на это уже час (внутри более крупной проблемы, которую я решил), и я думаю, что мой мозг замерз. Помощь по простой проблеме?

Ответы [ 3 ]

5 голосов
/ 30 сентября 2008

Это должно сделать это

select avg(total), customer 
from orders o1 
where orderdate in 
  ( select top 2 date 
    from orders o2 
    where o2.customer = o1.customer 
    order by date desc )
group by customer
0 голосов
/ 30 сентября 2008

Один из вариантов - использовать курсор для циклического перебора всех идентификаторов клиентов, а затем усреднять несколько подзапросов.

Справедливое предупреждение, хотя для больших наборов данных запросы не очень эффективны и могут занимать много времени.

0 голосов
/ 30 сентября 2008

В SQL Server 2005 у вас есть функция RANK, используемая с разделом:

USE AdventureWorks;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
    ,RANK() OVER 
    (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS 'RANK'
FROM Production.ProductInventory i 
    INNER JOIN Production.Product p 
        ON i.ProductID = p.ProductID
ORDER BY p.Name;
GO

Ссылка

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