如何平均每个SQL组中的前n个

时间:2019-05-01 15:37:45

标签: sql sql-server sql-server-2008

我试图弄清楚如何平均每个组中的前N个值。我有一个包含两列的表,即“组”和“值”。我的目标是平均每个组中的前N个值,其中N基于另一个表是不同的。

对于A组,N等于3,并以红色突出显示。输出是前三个值的平均值。

对于B组,N等于2,并以绿色突出显示。因为B组只有1个值为2.2的值,所以我们需要进入填充器表。 B组的填充值是2.0,因此我们将平均2.2和2.0。如果N = 5,则B组的填充值将重复4次。

我最初的想法是:

  1. 排列每组中的值

  2. 将其加入第二张表

  3. 使用排名<= N的位置在平均之前删除重复项

但是,我不确定如何合并填充表,因为N可以大于我拥有的值的数量。我确实需要使用SQL Server2008。

enter image description here

1 个答案:

答案 0 :(得分:0)

首先,我希望您使用的是更适当的名称,而不是“组和值”。这是一个示例代码,该代码首先定义顺序,然后定义将要使用的N个值并从中获得平均值。该代码未经测试,因为您没有提供消耗品样本数据。

WITH CTE AS(
    SELECT *,
        ROW_NUMBER() OVER( PARTITION BY [Group] ORDER BY [Value] DESC) AS rn,
        COUNT(*) OVER( PARTITION BY [Group]) ItemCount
    FROM TableWithValues
)
SELECT [Group],
    (SUM( [Value]) + CASE WHEN N.n > c.ItemCount 
                           THEN (N.n - c.ItemCount) * F.Filler
                           ELSE 0 END)/ N.n AS [Value]
FROM CTE c
JOIN TableWithN N ON c.[Group] = N.[Group] AND c.rn <= N.n
JOIN Fillers F ON c.[Group] = F.[Group]
GROUP BY [Group];