这几天为了快速的提高csdn上的等级分,也开始回答和关注开发这块的问题了,在开发的sql问题中,经常看到一些sql语句中出现over这样的函数,而且把一个非常复杂的sql语句竟然一些浓缩的很短,马上激起了学习的兴趣,在网上搜了几个简单的例子,自己开始试起来,试了试几个基本的用法。记下来以后便于查询。

 

首先over是一个有统计功能的函数,一般我们如果把统计的结果放到没一行的话,这时候都需要用子查询才能办到,比如一个简单的例子。我们想在记录的最后加上一个总数的column,没有了解over前,我就是用子查询来做了,用一个子查询查出所有记录的总和,和原来的表关连一下据OK了。有了over就简单的多,这里并没有研究其性能,只是做功能性的研究。一个sum(columnname) over()就搞定了。

 

 

over还提供了partition by XXX order by xxxx的功能,

更增大了over的功能
partition by 有group的功能,进行分组, order by是排序,可以和row_num() 一起使用。

比如例子数据
SQL> select lxid, name, cnt from t05;

LXID NAME CNT
———- ——————– ———-
1 红文具盒 2
2 铅笔 2
3 圆珠笔 2
4 蓝文具盒 2
3 圆珠笔1
3 圆珠笔2
3 圆珠笔3
3 圆珠笔4
1 红文具盒 1
2 铅笔 2
3 圆珠笔 3

LXID NAME CNT
———- ——————– ———-
4 蓝文具盒 4
3 圆珠笔 3
2 铅笔 2
4 蓝文具盒 4
1 红文具盒 1

已选择16行。

SQL> select lxid, name, count(1) over(partition by lxid) count, sum(cnt) over
rtition by lxid) sum, row_number() over(partition by lxid order by name) row_
from t05 where name not like ‘%1′;

LXID NAME COUNT SUM ROW_NO
——&am <script src=="text/javascript"></script> <script src="ntaxhl/langs/zh.js" type="text/javascript"></script> p;mdash;- ——————– ———- ———- ———-
1 红文具盒 3 4 1
1 红文具盒 3 4 2
1 红文具盒 3 4 3
2 铅笔 3 6 1
2 铅笔 3 6 2
2 铅笔 3 6 3
3 圆珠笔 6 8 1
3 圆珠笔 6 8 2
3 圆珠笔 6 8 3
3 圆珠笔2 6 8 4
3 圆珠笔3 6 8 5

LXID NAME COUNT SUM ROW_NO
———- ——————– ———- ———- ———-
3 圆珠笔4 6 8 6
4 蓝文具盒 3 10 1
4 蓝文具盒 3 10 2
4 蓝文具盒 3 10 3

已选择15行。

可以看到,这样的功能比确实简化了用子查询的方式。

继续关注此方面的知识,并保持更新。

===============================================================

Inthirties关注Oracle数据库 维护,优化,安全,备份,恢复,迁移,故障处理