结合 SQL Group By 计算 Top n 的平均值

Calculate average for Top n combined with SQL Group By

这是一个非常假设的示例,我正在连接两个表(ORDERS 和 ORDHIST)。我正在使用 MS-ACCESS 2010。我正在尝试编写一个连接或子查询,它将 return 两位销售人员在 DATE
之前的前 2 个最新订单的平均值 订单
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
订单ID 日期
123 2011 年 3 月 22 日
125 2011 年 3 月 25 日
127 2011 年 3 月 29 日
124 2011 年 3 月 24 日
126 2011 年 3 月 26 日
128 2011 年 3 月 30 日
129 2011 年 3 月 30 日
130 2011 年 1 月 4 日

我有 SQL 列出按 SalesPersonIDDate 排序的记录:

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 起息日
1 128 45 2011 年 3 月 30 日
1 125 55 25/03/2011
1 124 30 24/03/2011
1 123 100 22/03/2011
2 130 35 2011 年 1 月 4 日
2 129 60 2011 年 3 月 30 日
2 127 20 29/03/2011
2 126 80 26/03/2011

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

SalesPersonID LatestAvg
1 50
2 47.5

我是编写连接和内部查询的新手,我只能提取 SalesPerson 对他们所有订单的平均值

SELECT Orders.SalesPersonID, Avg(Orders.Value) AS AvgOfValue 
  FROM Orders 
  INNER JOIN OrdHist 
  ON Orders.OrderID = OrdHist.OrderID 
  GROUP BY Orders.SalesPersonID;
SalesPersonID 平均价值
1 57.5
2 48.75

但是这不会过滤组内最近的 2 个日期,因此非常感谢任何有关如何 select 在子查询内或创建另一个连接的指导

您可以使用自联接只获取每个销售人员的前 2 行,并使用派生的 table 将这些行分组以获得平均值。

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

这是最后使用的 SQL 语句

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 OrdHist oh2 on oh2.OrderID = o2.OrderID and oh2.Date >= OrdHist.Date 
GROUP BY Orders.SalesPersonID, Orders.OrderID, Orders.Value 
HAVING COUNT(*) <= 2
) t1 GROUP BY SalesPersonID