我试图弄清楚如何平均每个组中的前N个值。我有一个包含两列的表,即“组”和“值”。我的目标是平均每个组中的前N个值,其中N基于另一个表是不同的。
对于A组,N等于3,并以红色突出显示。输出是前三个值的平均值。
对于B组,N等于2,并以绿色突出显示。因为B组只有1个值为2.2的值,所以我们需要进入填充器表。 B组的填充值是2.0,因此我们将平均2.2和2.0。如果N = 5,则B组的填充值将重复4次。
我最初的想法是:
排列每组中的值
将其加入第二张表
使用排名<= N的位置在平均之前删除重复项
但是,我不确定如何合并填充表,因为N可以大于我拥有的值的数量。我确实需要使用SQL Server2008。
答案 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];