oracle 问答

发布时间 2023-08-21 06:42:14作者: 野鹤闲人

1、over partition by 按班级维度,取每个班第一名

 select *
    from (select t.id,
                 t.class,
                 t.sroce,
                 rank() over(partition by t.class order by t.sroce desc) n
            from school t)
    where n = 1;

2、扩展

row_number() over(partition by ... order by ...):返回分组排序后的顺序
rank() over(partition by ... order by ...):返回分组排序后的排名(并列第一名的情况下返回:第一名,第一名,第三名)
dense_rank() over(partition by ... order by ...):返回分组排序后的排名(并列第一名的情况下返回:第一名,第一名,第二名)
count(A) over(partition by ... order by ...):返回分组排序后的总数。
max(A) over(partition by ... order by ...):返回分组排序后的最大值。
min(A) over(partition by ... order by ...):返回分组排序后的最小值。
avg(A) over(partition by ... order by ...):返回分组排序后的平均值。
sum(A) over(partition by ... order by ...):返回分组排序后的累加求和。
lag(A,1) over(partition by ... order by ...):取出上一列的A的值放到本列中。  
lead(A,1) over(partition by ... order by ...):取出下一列的A的值放到本列中。  
ratio_to_report(A) over(partition by B) 返回分组后的A在其分区B内的占比,A就是分子,B分的组就是分母

3、