业务大佬给的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写法吗
记录下解题思路:先用窗口子句,计算出分区开始到当前行向后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个值一样的,排名逻辑就不太严谨了。不过业务说,他们也是按这个方法来计算的,影响不大姑且拿来用了
在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))
A
原语句慢