Упорядочить по верху в сгруппированных строках - PullRequest
2 голосов
/ 12 августа 2011

Как мне заказать по дате desc мои сгруппированные товары и получить топ 20?

Например: в таблице Orderproduct есть OrderID, ProductId, Date, Price, я хочу сгруппировать их по ProductId и отсортировать каждое сгруппированное по Date desc, затем получить топ 20 и avg (цена).

На LINQ это как (но сгенерированный sql очень грязный и производительность очень плохая).

OrderProduct
    .GroupBy(g => g.ProductId)
    .Select(s => new{ s.Key, Values = s.OrderByDescending(o => o.Date).Take(20) })
    .Select(s => new{ Avg = s.Values.Average(a => a.Price) } )

Ответы [ 3 ]

3 голосов
/ 12 августа 2011

Если я понимаю ваш вопрос, это может сработать для вас.

select ProductId,
       avg(price) as AvgPrice
from ( select ProductId,
              Price,
              row_number() over(partition by ProductId order by [Date] desc) as rn
       from Orderproduct
     ) as O
where rn <= 20
group by ProductId       
0 голосов
/ 12 августа 2011

Получается ли это, что вы хотите, чтобы вы ВСЕ строки? Я понимаю, что вы хотите только 20 лучших для каждого продукта. Я просто не хочу тратить время на топ-20, если это не правильно. И означает ли верхняя 20 20 самых высоких цен, или 20 самых последних дат, или 20 самых последних (может быть более одного в день на идентификатор продукта?)?

    SELECT [ProductID], [Date], [Price]
    FROM [OrderProduct] 
    ORDER BY [ProductID] asc, [Date] desc, [Price] desc 
    COMPUTE AVG(Price) BY [ProductID];
0 голосов
/ 12 августа 2011

Судя по вашим комментариям, это может сработать:

SELECT  [Date], 
        ProductID, 
        MIN(Price) as Min, 
        MAX(Price) as MAX, 
        AVG(Price) as Avg
FROM OrderProduct o1
WHERE [Date] IN (SELECT TOP 20 [Date] 
                 FROM OrderProduct o2
                 WHERE o1.productid = o2.productid)
GROUP BY [Date], ProductID
ORDER BY [Date] DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...