sql - 如何平均每个 SQL 组中的前 n 个
问题描述
我试图弄清楚如何平均每组中的前 N 个值。我有一个包含两列的表,组和值。我的目标是根据另一个表对每个组中 N 不同的前 N 个值进行平均。
对于 A 组,N 等于 3,并以红色突出显示。输出是前 3 个值的平均值。
对于 B 组,N 等于 2,并以绿色突出显示。因为我们只有 B 组的 1 个值 2.2,所以我们需要去填充表。B 组的填充值是 2.0,所以我们将平均 2.2 和 2.0。如果 N = 5,则 B 组的填充值将重复 4 次。
我最初的想法是:
对每组中的值进行排名
将其加入第二张桌子
使用 where Rank <= N 在平均之前删除重复项
但是,我不确定如何合并填充表,因为 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];
推荐阅读
- javascript - JS:如何从提取的内部函数中更改变量值?
- python - 使用 Python 从 google 日历 api 获取所有假期的列表
- android - OpenGL ES 2.0 GLSL 着色器无法编译
- java - 如何添加两个 char 数组并将输出作为 char 数组
- python-3.x - 从 wxPython 应用程序启动 python 解释器?
- r - 在 Rstudio 中对 rasterstack 应用条件和
- go - 在使用 Visual Studio 代码编辑第三个包中的 go lang 代码时,有没有办法自动完成代码?
- rshiny - 上传文件时 RSHINY 更新 selectinput
- java - 使用 Java 8 计算 true 的总布尔值
- wordpress - 如何删除 WP 多站点管理员“添加现有用户”部分中的下拉菜单?