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

How to average the top n in each SQL group

我想弄清楚如何计算每个组中前 N 个值的平均值。我有一个包含两列的 table,Group 和 Value。我的目标是平均每个组中的前 N ​​个值,其中 N 与另一个 table 不同。

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

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

我最初的想法是:

  1. 对每个组中的值进行排名

  2. 加入第二个table

  3. 使用 where Rank <= N 在求平均之前删除重复项

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

首先,我希望您使用更合适的名称而不是 Group 和 Value。这是一个示例代码,它首先定义顺序,然后定义将使用的 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];