美文网首页
Oracle经典实例——数值处理

Oracle经典实例——数值处理

作者: 梭哈侠 | 来源:发表于2020-03-31 15:58 被阅读0次
    1.计算平均值
    select avg(field1) avg_field1 from table_name;
    

    AVG函数会忽略null值,如果计算的字段中有null值,直接使用AVG的计算结果会不正确

    2.查找最大值和最小值

    使用MAX和MIN函数查找最大值和最小值:

    select max(field),min(field) from table_name;
    

    使用GROUP BY对字段进行分组后查找最大值、最小值:

    select field1,max(field2),min(field2) from table_name group by field1;
    

    MAX和MIN函数会忽略null值,当GROUP BY查询结果中有null分组时,最值将返回null

    3.求和

    针对整个表求和,直接使用SUM函数:

    select sum(field) from table_name;
    

    把数据分组再进行求和:

    select field1,sum(field2) from table_name group by field1;
    

    SUM函数会忽略null值,对于null分组,求和返回的值为null

    4.计算行数

    计算整个表的总行数,直接使用COUNT即可:

    select count(*) from table_name;
    

    使用GROUP BY把数据分成多个组:

    select field1,count(field2) from table_name group by field1;
    

    COUNT函数会包含null值,使用符号*或者常量参数的时候就会包含null值;
    如果参数列的值都为null或表里没有任何数据时,COUNT函数就会返回0

    5.累计求和

    使用SUM函数的窗口函数版本进行累计求和:

    select field1, field2, sun(field2) over(order by field2, field3) running_total
      from table_name
     order by 2;
    

    其中,有唯一性约束的field3字段的加入是为了保证求和结果中不包含重复值

    6.计算累计乘积

    使用窗口函数SUM OVER,并利用对数来模拟乘法:

    select field1,field2,field3,
           exp(sum(ln(field3)over(order by field1,field2)) as running_prod 
      from table_name where condition;
    

    不能使用SQL计算负数和0的对数,应避免将0和负数传递给LN函数

    7.计算累计差

    使用窗口函数SUM OVER计算累计差:

    select field1,field2,
           sum(case when rn = 1 then field2 else -field2 end) over(order by field2, field3) running_diff
      from (select fiel1,field2,field3,row_number() over(order by field2, field3) rn
              from table_name where conddition);
    
    8.计算众数

    使用聚合函数MAX的KEEP扩展来查找field列的众数:

    select max(field) keep(dense_rank first order by cnt desc) field
      from (select field, count(*) cnt
              from table_name
             where condition
             group by field);
    

    如果有多个众数,KEEP只会保留数值最大的那一个

    9.计算中位数

    使用函数MEDIAN:

    select median(field) from table_name where condition;
    
    10.计算百分比

    使用内嵌视图和窗口函数SUM OVER得到field2字段的总和和field1字段满足的条件的总和,然后在外层执行除法和乘法:

    select distinct (f10 / total) * 100 pct
      from (select field1,
                   sum(field2) over() total,
                   sum(field2) over(partition by field1) f10
              from table_name)
     where comdition;
    
    11.聚合null值

    使用COALESCE函数把null值转换为0,以保证使用聚合函数时结果不会出错:

     select avg(coalesce(field,0)) avg_field from table_name where condition;
    
    12.计算平均值时去掉最大值和最小值
     select avg(field)
      from (select field,
                   min(field) over() min_field,
                   max(field) over() max_field
              from table_name)
     where field not in (min_field, max_field);
    
    13.将含有字母和数字的字符串转换为数字

    使用函数TRANSLATE和REPLACE从含有字母和数字的字符串里提取数字字符:

     select cast(replace(translate('zghj123sdjf321',
                                  'abcdefghijklmnopqrstuvwxyz',
                                  rpad('#', 26, '#')),
                        '#') as integer) num
      from dual;
    

    整理自《SQL经典实例》

    相关文章

      网友评论

          本文标题:Oracle经典实例——数值处理

          本文链接:https://www.haomeiwen.com/subject/jcnwuhtx.html