分区:
如:需要对部门的员工收入 ,体育中的成绩进行排名的时候,要进行分部门,分栏目,分项目排名,这个时候要按分区计算,当然主要使用解析函数,----------------------->返回多行
一:解析函数() over(partition by 字段 order by 字段)
案例:
_ 各种新闻(娱乐,体育,8挂,军事)的单击率在前3名记录
_ 每种图片(计算机类,考试类,文学),销售量在前10名记录
_ 每个班的前3名
二:分组: ---------------------->返回一行
求每个部门的max sum min count avg 时 可用group by
分区排名实例:
--1:脚本
create table T_NEWS ( ID NUMBER, N_TYPE VARCHAR2(20), N_TITLE VARCHAR2(30), N_COUNT NUMBER ) ; insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) values (1, 'IT', '爱it1', 100); insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) values (2, '体育', '爱体育1', 10); insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) values (3, '体育', '爱体育2', 30); insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) values (4, 'IT', '爱it2', 300); insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) values (5, 'IT', '爱it3', 200); insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) values (6, '体育', '爱体育3', 20); insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT) values (7, '体育', '爱体育4', 60); commit;
select * from t_news;
要求:根据显示各栏目(N_TYPE)点击率(N_COUNT)在前2名的记录
即要求显示:
查询语句为:
select a.*
from (
select t.*,
rank() over (partition by t.n_type order by t.n_count desc) news_rank
from t_news t
) a
where news_rank<=2
知识点:Oracle解析函数
说明:
·order by t.n_count desc:点击率排序
·rank:所排的名次
·partition:根据什么字段分区,不同区相互之间不互相影响。
说明:
partition(分区)与group by(分组)的区别是:前者仅仅是将数据按指定字段分开,分开后各区仍有多少记录;后者是根据指定字段进行分组,分组以后各组记录只能返回一条记录(即要进行聚合计算)。
类似的任务还有:统计各部门收入最高的前5条记录等。这类任务如果没有分区的技术,很难办到。所以再次体会到Oracle的强大之处。
不分区排名实例:
操作emp表
SELECT e.*,row_number() over(ORDER BY e.sal DESC) x
FROM emp e ;
SELECT * FROM (
SELECT t.*,row_number() over(ORDER BY t.sal DESC) r
FROM emp t
ORDER BY t.sal DESC
) t
WHERE r BETWEEN 1 AND 3