如何获得同一表格中每条记录的前5名平均值

时间:2017-08-02 21:13:02

标签: sql sql-server

我需要计算一些价格的平均值,如下所示。我可以为该表中的每个记录执行此操作,但如果我只想为前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;

5 个答案:

答案 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