提问人:HarryB 提问时间:2/2/2023 最后编辑:Dale KHarryB 更新时间:2/2/2023 访问量:48
按分区取一列中前 10 个条目的平均值
Take the mean of the top 10 entries in a column by partition
问:
因此,我有一个表,每个空间区域都有一个唯一的键,每个测量时间都有另一个唯一的键,以及有问题的变量。我创建了一个“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 名的平均值) |
我能帮忙吗?
答:
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;
评论
ntile(10) ... as nt ... WHERE nt <= 1
ROW_NUMBER() ... as rn ... WHERE rn <= 10
ORDER BY Variable DESC