在分组行上排序和排在最前面

时间:2011-08-12 13:42:13

标签: sql-server tsql sql-server-2008

如何按日期订购我的分组商品并获得前20名?

例如:表Orderproduct有OrderID,ProductId,Date,Price,我想按ProductId进行分组,并按Date desc分组,然后获得前20名和平均(价格)。

在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 个答案:

答案 0 :(得分:3)

如果我理解你的问题,这可能适合你。

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       

答案 1 :(得分:0)

根据您的意见,这可能有效:

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

答案 2 :(得分:0)

这是否让您想要所有行?我理解你只想要每个产品的前20名。如果这不正确,我只是不想花时间在前20名。前20名表示20个最高价格,或20个最近日期,或20个最近(每个产品ID每天可以有多个?)?

    SELECT [ProductID], [Date], [Price]
    FROM [OrderProduct] 
    ORDER BY [ProductID] asc, [Date] desc, [Price] desc 
    COMPUTE AVG(Price) BY [ProductID];