如何按日期订购我的分组商品并获得前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) } )
答案 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];