我需要计算一些价格的平均值,如下所示。我可以为该表中的每个记录执行此操作,但如果我只想为前5个最新日期记录执行此操作,该怎么办?下面的查询确实提供了平均值,但对于一切,但我正在寻找前5个desc日期。这可以使用row_number()来解决,但这可能太慢了,因为我在该表中有大量记录,row_number一次处理每一行等等有没有更好的方法呢?我试图在SQLServer DB BTW上执行此操作。
select a.id, AVG(a.someprice) as avgPrice
from
(select p.id, p.date, calculateSomePrice(p.id, p.date) someprice
from table1 p
where p.id in (select id from table1)) a
group by a.id
;
让我给你一些我在桌面上的例子记录,它可以澄清我在寻找什么。
id date prc
1 08/02/2017 1.5
1 08/01/2017 2.5
1 07/31/2017 3.5
1 07/30/2017 1
1 07/29/2017 4
1 07/23/2017 4.5
1 07/20/2017 5
1 07/22/2017 5.5
2 07/29/2017 1.5
2 07/28/2017 2.5
2 07/27/2017 4
2 07/26/2017 4
2 07/23/2017 5.5
2 07/22/2017 3.5
2 07/21/2017 5
2 07/20/2017 0.5
2 07/18/2017 4.5
现在,当我们在查询之上运行时,我们得到所有记录的所有内容的平均值,但我要查找的是每个id的每个日期的前5个平均值。在这种情况下,1和2都是。
下面的查询将给出我正在寻找的id 1的结果,但是我需要对我表中的所有ID执行此操作,而我的表有481397362条记录,所以在循环中执行此操作并不合理。
select a.id, AVG(a.somePrice)
from (
select top 5 p.id, p.date, calculateSomePrice(p.id, p.date) somePrice
from table1 p
where p.id = 1
order by p.date desc ) a
group by a.id;
答案 0 :(得分:0)
您可以选择TOP 5 ID并使用它们找出average
。
select a.id, AVG(a.someprice) as avgPrice
from
(select p.id, p.date, calculateSomePrice(p.id, p.date) someprice
from table1 p
where p.id in (select TOP 5 id from table1 order by update_Date desc)) a
group by a.id;
答案 1 :(得分:0)
你可以这样做:
select a.id, AVG(a.someprice) as avgPrice
from
( select TOP 5 p.id, p.date, calculateSomePrice(p.id, p.date) someprice
from table1 p
ORDER BY P.DATE DESC
) a
group by a.id
;
答案 2 :(得分:0)
根据您的查询和示例结果,我们需要在DESC中标记您的前5个avgPrice
WITH cte AS (
SELECT a.id,
AVG(a.someprice) as avgPrice
FROM (SELECT p.id,
p.date, calculateSomePrice(p.id, p.date) someprice
FROM table1 p
WHERE p.id in (SELECT id
FROM table1)
) a
GROUP BY a.id
)
SELECT id,
avgPrice
FROM (SELECT id,
avgPrice,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY avgPrice DESC) rank
FROM cte
GROUP BY id,
avgPrice
) t
WHERE rank <=5
答案 3 :(得分:0)
如果我理解您的要求,您可以查询如下:
public IActionResult Teste(int id = -1)
答案 4 :(得分:0)
选择a.id,avg(a.prc)作为avgPrice ( 选择 * FROM( SELECT id,date,prc,Rank() over(Partition BY id ORDER BY date DESC)AS Rank 从表 )rs WHERE Rank&lt; = 5 ) 分组由a.id