计算前n个与SQL Group By相结合的平均值 [英] Calculate average for Top n combined with SQL Group By

查看:230
本文介绍了计算前n个与SQL Group By相结合的平均值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个非常假设的示例,其中我连接了两个表(ORDERS和ORDHIST).我正在使用MS-ACCESS2010.我正在尝试编写一个联接或子查询,该联接或子查询将返回DATE
之前两个TOP 2最新订单的销售人员的平均值. 订单
SalesPersonID OrderID   
1              b     123    100
1              b     124    30
1              b     125    55
2              nbsp; b     126     80
2              nbsp; b     127     20
1            &nspsp;     128     45
2              nbsp; b     129     60
2              nbsp; b     130     35

This is a very hypothetical example where I am joining two tables (ORDERS and ORDHIST). I'm using MS-ACCESS 2010. I'm trying to write a join or subquery which will return the average for both salespeople for their TOP 2 most recent orders by DATE
ORDERS
SalesPersonID OrderID  Value
1                             123     100
1                             124     30
1                             125     55
2                             126     80
2                             127     20
1                             128     45
2                             129     60
2                             130     35

ORDHIST
OrderID     日期
123       2011年3月22日
125       25/03/2011
127       29/03/2011
124       24/03/2011
126        2011年3月26日
128       30/03/2011
129        30/03/2011
130       2011年1月4日

ORDHIST
OrderID    Date
123       22/03/2011
125       25/03/2011
127       29/03/2011
124       24/03/2011
126       26/03/2011
128       30/03/2011
129       30/03/2011
130       01/04/2011

我有SQL列出按 SalesPersonID Date :

SELECT Orders.SalesPersonID, Orders.OrderID, Orders.Value, OrdHist.Date 
  FROM Orders 
  INNER JOIN OrdHist ON Orders.OrderID = OrdHist.OrderID 
  ORDER BY Orders.SalesPersonID, OrdHist.Date DESC;


SalesPersonID OrderID  Value   Date  
1              128       45    30/03/2011  
1              125       55    25/03/2011  
1              124       30    24/03/2011  
1              123      100    22/03/2011  
2              130       35    01/04/2011  
2              129       60    30/03/2011  
2              127       20    29/03/2011  
2              126       80    26/03/2011  

所以我现在想为每个SalesPerson选择前两行,并仅显示两行的平均值,以得出我正在寻找的最终结果:

So I now want to pick the first two rows for each SalesPerson and show just the average of the two to give this Final result I'm looking for:


SalesPersonID   LatestAvg
1               50
2               47.5

我是编写联接和内部查询的新手,我无法超越SalesPerson提取所有订单的平均值

I'm new to writing joins and inner queries and I can't get beyond extracting the average by SalesPerson for all of their orders

SELECT Orders.SalesPersonID, Avg(Orders.Value) AS AvgOfValue 
  FROM Orders 
  INNER JOIN OrdHist 
  ON Orders.OrderID = OrdHist.OrderID 
  GROUP BY Orders.SalesPersonID;


SalesPersonID   AvgOfValue
1               57.5
2               48.75

但这不会在组中的最近2个日期进行过滤,因此,有关如何在子查询中进行选择或创建另一个联接的任何指导都将受到赞赏

But this isn't filtering on most recent 2 dates within the group so any guidance on how to select within a subquery or create another join will be much appreciated

推荐答案

您可以使用自我联接仅获取每个销售人员的前2行,并使用派生表将这些行的平均值进行分组.

You can use a self join to only get the top 2 rows for each sales person and use a derived table to group those rows for their average.

SELECT SalesPersonID, AVG(Value) As AvgOfValue FROM (
  SELECT Orders.SalesPersonID, Orders.Value
  FROM Orders 
  INNER JOIN OrdHist ON Orders.OrderID = OrdHist.OrderID
  INNER JOIN Orders o2 on o2.SalesPersonId = Orders.SalesPersonId
  INNER JOIN OrderHist oh2 on oh2.OrderID = o2.OrderID and oh2.Date <= Orders.Date
  GROUP BY Orders.SalesPersonID, Orders.OrderID, Orders.Value
  HAVING COUNT(*) <= 2
) t1 GROUP BY SalesPersonID

这篇关于计算前n个与SQL Group By相结合的平均值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆