Return 分组值的平均值以及同一查询中该值前 n% 的平均值?

Return the mean of a grouped value along with the mean of the top n% of that value in the same query?

我需要编写一个查询,其中 return 一组字段的平均值以及一组字段中前 33% 的值的平均值。

UserId | Sequence | Value | Value2
-------|----------|-------|-------
1      | 1        | 5     | 0
1      | 2        | 10    | 15
1      | 3        | 15    | 20
1      | 4        | NULL  | 25
1      | 5        | NULL  | 30
1      | 6        | NULL  | 60

return 还需要包含用于计算平均值的分母,我想按用户和 return 分组,如下所示:

UserId | ValueMean | ValueDenom | ValueTopNMean | ValueTopNDenom | Value2Mean | Value2Denom | Value2TopNMean | Value2TopNDenom
-------|-----------|------------|---------------|----------------|------------|-------------|----------------|----------------
1      | 10        | 3          | 15            | 1              | 25         | 6           | 45             | 2

我尝试了各种 window 函数(NTILE、PERCENT_RANK 等),但棘手的是我有多个值字段需要进行相同的操作,并且每个值字段的分母会有所不同(但是,n% 将保持不变)。如果我不清楚或者您需要更多信息,请告诉我。

总体平均值和最高值,以及非 null 值的计数,可以使用聚合函数轻松计算。

至于前 N 个值的平均值和计数:您可以在子查询中使用 ntile() 首先识别相关行,然后在外部查询的聚合函数内的条件表达式中使用该信息。

select
    userid,
    avg(value)   avg_value,
    count(value) cnt_value,
    max(value)   top_value,
    avg(case when ntile_value = 1 then value end)    avg_topn_value,
    sum(case when ntile_value = 1 then 1 else 0 end) cnt_topn_value
from (select t.*, ntile(3) over(order by value) ntile_value from mytable t) t
group by userid