ITPub博客

首页 > 数据库 > Oracle > 【Analytic】分析函数之MIN函数

【Analytic】分析函数之MIN函数

原创 Oracle 作者:OCMU联盟 时间:2010-01-08 23:55:59 0 删除 编辑
大家对MIN函数一定非常了解,可能会问,不就是得到一组数据中最小值,有必要讨论么?
问的好,诚然,对于MIN函数的普通用法来说着实简单,不过MIN函数还有一种分析函数的使用方法,可以得到每组数据分析之后的“最小值”。我们来通过两条SQL比较一下这两种用法。

1.万变不离其宗,先看MIN函数的语法描述。

MIN([ DISTINCT | ALL ] expr)
   [ OVER (analytic_clause) ]

从语法上看,有一个“OVER”类型的扩展,这便是分析函数语法部分。

2.通过实验看一下两种MIN函数的用法和区别
1)创建测试表T,并初始化几条数据。
sec@ora10g> create table t (group_id number(10), name varchar2(10), salary int);
sec@ora10g> insert into t values (1,'Tom',1200);
sec@ora10g> insert into t values (2,'Kary',2400);
sec@ora10g> insert into t values (2,'Joe',800);
sec@ora10g> insert into t values (3,'Erick',3600);
sec@ora10g> insert into t values (3,'Andy',600);
sec@ora10g> insert into t values (3,'Mary',300);
sec@ora10g> commit;

2)T表全貌
sec@ora10g> select * from t;

  GROUP_ID NAME                               SALARY
---------- ------------------------------ ----------
         1 Tom                                  1200
         2 Kary                                 2400
         2 Joe                                   800
         3 Erick                                3600
         3 Andy                                  600
         3 Mary                                  300

6 rows selected.

共三组数据,group_id分别是1、2和3。第1组有一个人,第2组有两个人,第3组有三个人。最后一列是每个人的薪水值。

3)先看一下普通MIN函数的用法
sec@ora10g> select group_id, name, salary, min(salary) from t group by group_id, name, salary order by group_id;

  GROUP_ID NAME                               SALARY MIN(SALARY)
---------- ------------------------------ ---------- -----------
         1 Tom                                  1200        1200
         2 Joe                                   800         800
         2 Kary                                 2400        2400
         3 Andy                                  600         600
         3 Erick                                3600        3600
         3 Mary                                  300         300

6 rows selected.

得到的最小值是按照“group_id, name, salary”三列进行分组后的每组最小值。

4)再看一下分析函数MIN得到的最小值
sec@ora10g> select group_id, name, salary, min(salary) over (partition by group_id) analytic_min from t order by group_id;

  GROUP_ID NAME                               SALARY ANALYTIC_MIN
---------- ------------------------------ ---------- ------------
         1 Tom                                  1200         1200
         2 Kary                                 2400          800
         2 Joe                                   800          800
         3 Erick                                3600          300
         3 Andy                                  600          300
         3 Mary                                  300          300

6 rows selected.

注意这里得到的最小值与基本MIN函数得到的最小值区别,这里的最小值是每行记录所对应组内的最小薪酬值。
这样的最小值是非常有意义的,在复杂的数据统计和分析系统中用处极大。

3.小结
本文通过两个例子展示了MIN函数的两种使用方法,为了清晰的比较,给出的都是最基本的使用方法。对于MIN的分析函数的使用还可以进一步的扩展,慢慢体会吧。
有关分析函数的扩展可以参考Oracle的官方文档中的“Analytic Functions”描述:

Good luck.

secooler
10.01.08

-- The End --

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70034820/viewspace-2994193/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
OCM联盟( Oracle Certified Master Union)是由侯圣文(ACE总监)发起的一个公益组织,旨在为每一个OCM大师提供一个可以继续展示自己才华,技术和实力的平台。

注册时间:2007-05-27

  • 博文量
    799
  • 访问量
    8407002