按分区取一列中前 10 个条目的平均值

Take the mean of the top 10 entries in a column by partition

提问人:HarryB 提问时间:2/2/2023 最后编辑:Dale KHarryB 更新时间:2/2/2023 访问量:48

问:

因此,我有一个表,每个空间区域都有一个唯一的键,每个测量时间都有另一个唯一的键,以及有问题的变量。我创建了一个“MeasID”,它将这些连接在一起 (AreaKey_MeasureKey),我想创建一个具有该 MeasID 的新视图,并为每个唯一的 MeasID 获取前 10 个值。我很确定我想用分区来做这件事。

我从中绘制的变量使新视图看起来像

区域键 测量键 变量
-------- -------- 2.34
1 1 4.56
1 2 7.23

我不确定视图的代码应该是什么。我发现了很多关于选择分区的顶部部分或选择列的前 n 个部分的答案,但似乎从未将它们组合在一起。

我尝试过以下方法

SELECT MeasID
    ,AVG(Variable) AS Variable_Avg
FROM (
    SELECT MeasID
        ,Variable
        ,ntile(10) OVER (
            PARTITION BY MeasID ORDER BY Variable
            ) AS nt
    FROM Table
    ) AS T
WHERE nt <= 1
GROUP BY MeasID
ORDER BY MeasID

但是,我相信这会将分区拆分为 to 并占据前 1 名。我想选择前 10 名,无论是 15 还是 1150 的大小。

我希望结果如下所示

测量ID的 Variable_top10avg
1_1 (前 10 名的平均值)
1_2 (前 10 名的平均值)

我能帮忙吗?

SQL Server 分区 错误消息传递

评论

1赞 Tim Biegeleisen 2/2/2023
原始表的示例数据将对您的问题有所帮助。
0赞 T N 2/2/2023
而不是 ,请尝试 。另外,如果要选择变量的前 10 个最大值,我希望您需要 .ntile(10) ... as nt ... WHERE nt <= 1ROW_NUMBER() ... as rn ... WHERE rn <= 10ORDER BY Variable DESC

答:

0赞 ClearlyClueless 2/2/2023 #1
    WITH 
        T AS (
            SELECT
            ROWNUMBER() OVER (
                PARTITION BY MeasID 
                ORDER BY Variable DESC
            ) AS rn,
            MeasID
            Variable
            FROM Table
        )

    SELECT MeasID,
        AVG(Variable)
    FROM T
    WHERE rn <= 10 
    GROUP BY MeasID
    ORDER BY MeasID ASC;