2008-09-30 6 views
3

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

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).

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

+0

Какая версия SQL Server? – Sklivvz 2008-09-30 15:38:16

+0

Может ли заказчик иметь несколько заказов в день? – 2008-09-30 15:45:46

ответ

5

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

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

Может не работать, если в данный день более 1 порядка, например. если для клиента у вас есть 3 заказа на один день. подзапрос даст вам 2 записи одной и той же даты, а верхний запрос будет учитывать все 3 порядка - но, возможно, это не сценарий реальной жизни в контексте. – kristof 2008-09-30 16:01:15

0

В 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 

Link

0

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

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

Смежные вопросы