Oracle分组函数小结

Oracle分组函数小结

 

1.OVER (PARTITION BY ..)

例:select a,b,c, sum(c)  OVER (PARTITION BY b) sum_c

对 b列值相同的行进行c值的累计.

 

-- 检索指定的零售户类型个数所占的百分比

select t2.*,round(t2.cust_count/t2.cust_count_all,3)*100 as count_percent from(

  select t.*,

  sum(cust_count) over (partition by t.regie_org_code,t.analysis_month)

  as cust_count_all

  from(

    select r.regie_org_code,r.analysis_month,r.cust_type,

    count(*) as cust_count

    from rm_monitor_results r

group by r.regie_org_code,r.analysis_month,r.cust_type) t)t2

 

2.按照区间进行分组

 

select

sum(case when abs(r.sample_z_value)>=3 then 1 else 0 end) as p3,

sum(case when abs(r.sample_z_value)>=2 then 1 else 0 end) as p2,

sum(case when abs(r.sample_z_value)<2  then 1 else 0 end) as p1,

sum(1) as p0

from Rm_Monitor_Statistics_Analysis r

where r.regie_org_code='13500401'

 

3.ROLLUP

ROLLUP是对group by的扩展,因此,它只能出现在group by子句中,依赖于分组的列,对每个分组会生成汇总数据, rollup和group by联合一起使用,达到了按group by列顺序分组,并且实现小计和合计的功能。rollup分组还是有序的,先全部分组,然后对每个分组小计,最后合计,使处理结果更清楚.

rollup中列的顺序不同,则统计的结果不同。因为它是按列从右递减分组的。

例:

--对不同专卖局的不同月份进行分组小计和合计

select r.regie_org_code,r.year_month,count(*)

from rm_monitor_statistics_analysis  r

group by rollup (r.regie_org_code,r.year_month)

 

如果在实际查询中,有的小计或合计我们不需要,那么就要使用局部rollup,局部rollup就是将不需要小计(合计)的列放在group by中,而不是放在rollup中。

 

例:

--对不同专卖局不同月份进行分组统计并只对局进行合计

select r.regie_org_code,r.year_month,count(*)

from rm_monitor_statistics_analysis  r

group by rollup (r.regie_org_code),r.year_month

 

4.CUBE

CUBE(交叉列表)也是对group by运算的一种扩展,它比rollup扩展更加精细,组合类型更多,rollup是按组合的列从右到左递减分组计算,而CUBE则是对所有可能的组合情况进行分组,这样分组的情况更多,覆盖所有的可能分组,并计算所有可能的分组的小计。

 

对于CUBE来说,列的名字只要一样,那么顺序无所谓,结果都是一样的,因为cube是各种可能情况的组合,只不过统计的结果顺序不同而已。但是对于rollup来说,列的顺序不同,则结果不同。

 

例:

--对不同专卖局和不同月份进行两两交叉统计

select r.regie_org_code,r.year_month,count(*)

from rm_monitor_statistics_analysis  r

group by cube (r.regie_org_code,r.year_month)

 

部分CUBE和部分ROLLUP类似,把不想要的小计和合计的列放到group by中,不放到cube中就可以了。

如果cube中只有一个列,那么和rollup的结果一致

例:

select r.regie_org_code,r.year_month,count(*)

from rm_monitor_statistics_analysis  r

group by cube (r.regie_org_code),r.year_month

 

5.GROUPING SETS

对group by的另一个扩展,专门对分组列分别进行小计计算,不包括合计。使用方式和rollup和cube一样,都是放在group by中。

 

--对不同专卖局,不同月份每个列分别进行小计计算,改变统计列的顺序,不影响统计结果。

select r.regie_org_code,r.year_month,count(*)

from rm_monitor_statistics_analysis  r

group by grouping sets (r.regie_org_code,r.year_month)

 

6.删除重复记录

例:

delete from emp e where e.rowid > (select min(y.rowid)

from emp y

where y.empno = e.empno )

 

7.其它性能优化

(1):SELECT子句中避免使用 ‘ * ‘
(2):使用exists语句代替in语句;
(3):   使用not exists代替not in
(4):使用truncate代替delete from 表语句
(5):减少访问数据库的次数
(6):使用表的别名(Alias)
(7):尽快使用COMMIT
(8):数据库冗余字段的设计

posted @ 2013-06-08 23:14  rocket_guo  阅读(266)  评论(0编辑  收藏  举报