Oracle里面取前三均值,分析函数应该怎么写?

业务大佬给的Excel表需要求前三名的均值,Excel的函数这么写:

=AVERAGE(LARGE($E$3:$E$17,{1,2,3}))

Oracle我现在只会这么写:

SELECT round(avg(a)) a_top3 from(

SELECT a,dense_rank() over(order by a desc) rank1

FROM table) WHERE rank1<=3

有更简洁的SQL写法吗

FineReport hotfog119 发布于 2022-3-18 14:22 (编辑于 2022-3-18 14:22)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共2回答
最佳回答
0
hotfog119Lv7初级互助
发布于2022-3-22 10:30(编辑于 2022-3-22 10:35)

记录下解题思路:先用窗口子句,计算出分区开始到当前行向后2行的均值,在用 first_value取第一条记录。

具体代码如下:

first_value(avg() over(order by  aa  desc  

ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING)) over ( order by avg(aa) 

over(order by aa desc  ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING) desc)avg_aa_top3

当然,遇到N个值一样的,排名逻辑就不太严谨了。不过业务说,他们也是按这个方法来计算的,影响不大姑且拿来用了

最佳回答
0
Z4u3z1Lv6专家互助
发布于2022-3-18 14:35(编辑于 2022-3-18 14:36)

在SQL server 上 这样效率要高些,不知道oracle是不是一样

SELECT * FROM (

SELECT TOP 3 WF_WORK_ID,dense_rank() over(order by WF_WORK_ID desc) rank1

FROM WF_WORK ORDER BY dense_rank() over(order by WF_WORK_ID desc))

image.png

原语句慢

image.png

  • zsh331 zsh331 小伙子,要考虑bug,前N个值都一样,怎么办…
    2022-03-18 14:40 
  • Z4u3z1 Z4u3z1 回复 zsh331 反应过来了 你说的对
    2022-03-18 14:44 
  • Z4u3z1 Z4u3z1 回复 zsh331 欠考虑了.....
    2022-03-18 14:44 
  • zsh331 zsh331 回复 Z4u3z1 并无恶意,纯属沟通- -###
    2022-03-18 14:45 
  • Z4u3z1 Z4u3z1 回复 zsh331 字面上的意思,别误会~~~ ^_^
    2022-03-18 14:50 
  • 1关注人数
  • 446浏览人数
  • 最后回答于:2022-3-22 10:35
    请选择关闭问题的原因
    确定 取消
    返回顶部