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
我需要编写一个查询,其中 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