以下是小编帮大家整理的分页查询(用rownumber和开窗函数over更方便)(共含5篇),仅供参考,大家一起来看看吧。同时,但愿您也能像本文投稿人“xixi努力学习”一样,积极向本站投稿分享好文章。
查询MyStudents表中第8页中的数据(每页3条记录)
--(1)
select * from
(
select *,
ROW_NUMBERover(order by FId asc) as Rnumber
from MyStudents
)
as Tbl3
where Rnumber between (3*7+1) and 3*8
--(2)
select top 3 * from MyStudents
where FId not in
(select top (3*7) FId from MyStudents
order by FId )
order by FId
oracle的分析函数over及开窗函数
eg: 相关解析:
表t_pi_part
字段 id code name
value 1 222 a
value 2 222 b
value 3 333 c
给code相同的part code 添加行标,根据id 排序
select p.* ,row_number()over(partition by p.code order order by a.id desc) as row_index from t_pi_part p;
一:分析函数over
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是
对于每个组返回多行,而聚合函数对于每个组只返回一行,
下面通过几个例子来说明其应用。
1:统计某商店的营业额。
date sale
1 20
2 15
3 14
4 18
5 30
规则:按天统计:每天都统计前面几天的总额
得到的结果:
DATE SALE SUM
----- -------- ------
1 20 20 --1天
2 15 35 --1天+2天
3 14 49 --1天+2天+3天
4 18 67 .
5 30 97 .
2:统计各班成绩第一名的同学信息
NAME CLASS S
----- ----- ----------------------
fda 1 80
ffd 1 78
dss 1 95
cfe 2 74
gds 2 92
gf 3 99
ddd 3 99
adf 3 45
asdf 3 55
3dd 3 78
通过:
--
select * from
(
select name,class,s,rank()over(partition by class order by s desc) mm from t2
)
where mm=1
--
得到结果:
NAME CLASS S MM
----- ----- ---------------------- ----------------------
dss 1 95 1
gds 2 92 1
gf 3 99 1
ddd 3 99 1
注意:
1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果
2.rank()和dense_rank()的区别是:
--rank()是跳跃排序,有两个第二名时接下来就是第四名
--dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
3.分类统计 (并显示信息)
A B C
-- -- ----------------------
m a 2
n a 3
m a 2
n b 2
n b 1
x b 3
x b 2
x b 4
h b 3
select a,c,sum(c)over(partition by a) from t2
得到结果:
A B C SUM(C)OVER(PARTITIONBYA)
-- -- ------- ------------------------
h b 3 3
m a 2 4
m a 2 4
n a 3 6
n b 2 6
n b 1 6
x b 3 9
x b 2 9
x b 4 9
如果用sum,group by 则只能得到
A SUM(C)
-- ----------------------
h 3
m 4
n 6
x 9
无法得到B列值
=====
select * from test
数据:
A B C
1 1 1
1 2 2
1 3 3
2 2 5
3 4 6
---将B栏位值相同的对应的C 栏位值加总
select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum
from test
A B C C_SUM
1 1 1 1
1 2 2 7
2 2 5 7
1 3 3 3
3 4 6 6
---如果不需要已某个栏位的值分割,那就要用 null
eg: 就是将C的栏位值summary 放在每行后面
select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum
from test
A B C C_SUM
1 1 1 17
1 2 2 17
1 3 3 17
2 2 5 17
3 4 6 17
求个人工资占部门工资的百分比
SQL>select * from salary;
NAME DEPT SAL
---------- ---- -----
a 10
b 10 3000
c 10 5000
d 20 4000
SQL>select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;
NAME DEPT SAL PERCENT
---------- ---- ----- ----------
a 10 2000 20
b 10 3000 30
c 10 5000 50
d 20 4000 100
二:开窗函数
开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
1:
over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数
over(partition by deptno)按照部门分区
2:
over(order by salary range between 5 preceding and 5 following)
每行对应的数据窗口是之前行幅度值不超过5,之后行幅度值不超过5
例如:对于以下列
aa
1
2
2
2
3
4
5
6
7
9
sum(aa)over(order by aa range between 2 preceding and 2 following)
得出的结果是
AA SUM
---------------------- -------------------------------------------------------
1 10
2 14
2 14
2 14
3 18
4 18
5 22
6 18
7 22
9 9
就是说,对于aa=5的一行 ,sum为 5-1<=aa<=5+2 的和
对于aa=2来说 ,sum=1+2+2+2+3+4=14 ;
又如 对于aa=9 ,9-1<=aa<=9+2 只有9一个数,所以sum=9 ;
3:其它:
over(order by salary rows between 2 preceding and 4 following)
每行对应的数据窗口是之前2行,之后4行
4:下面三条语句等效:
over(order by salary rows between unbounded preceding and unbounded following)
每行对应的数据窗口是从第一行到最后一行,等效:
over(order by salary range between unbounded preceding and unbounded following)
等效
over(partition by null)
Word文档在编辑过程中可能会经过多次修改,
Word2010查询文档编辑修改信息更方便
。那么在这篇文档中我们究竟花费了多大的精力去编辑修改呢?Word 2010可以给你准确答案,首先打开要查询的文档,依次单击“文件”――“信息”按钮,在“信息”面板中单击“属性”按钮,然后在打开的下拉列表中选择“高级属性”选项。在打开的“文档属性”对话框中,切换到“统计”选项卡。在这里大家可以查看“修改时间”、“上次保存者”、“修订次数”等信息,这样你付出的辛苦就一目了然了。
Oracle 9i提供了很多函数可以用来辅助数据查询,
用SQL进行函数查询数据库教程
。接下来我们介绍常用的函数功能及使用方法。4.5.1 【ceil】函数
在【命令编辑区】输入“select mgr, mgr/100,ceil(mgr/100) from scott.emp;”,然后单击【执行】按钮,出现如图4.29所示的结果。
【参见光盘文件】:\第4章\4.5\451.sql。
【ceil】函数用法:ceil(n),取大于扔谑值n的最小整数。
4.5.2 【floor】函数
在【命令编辑区】输入“select mgr, mgr/100,floor(mgr/100) from scott.emp;”,然后单击【执行】按钮,出现如图4.30所示的结果。
【参见光盘文件】:\第4章\4.5\452.sql。
【floor】函数用法:floor(n),取小于等于数值n的最大整数。
4.5.3 【mod】函数
在【命令编辑区】输入“select mgr, mod(mgr,1000), mod(mgr,100), mod(mgr,10) from scott.emp;”,然后单击【执行】按钮,出现如图4.31所示的结果。
【参见光盘文件】:\第4章\4.5\453.sql。
【mod】函数用法:mod(m,n),取m整除n后的余数。
4.5.4 【power】函数
在【命令编辑区】输入“select mgr, power(mgr,2),power(mgr,3) from scott.emp;”,然后单击【执行】按钮,出现如图4.32所示的结果。
【参见光盘文件】:\第4章\4.5\454.sql。
【power】函数用法:power(m,n),取m的n次方。
4.5.5 【round】函数
在【命令编辑区】输入“select mgr, round(mgr/100,2),round(mgr/1000,2) from scott.emp;”,然后单击【执行】按钮,出现如图4.33所示的结果。
【参见光盘文件】:\第4章\4.5\455.sql。
【round】函数用法:round(m,n),四舍五入,保留n位。
4.5.6 【sign】函数
在【命令编辑区】输入“select mgr, mgr-7800,sign(mgr-7800) from scott.emp;”,然后单击【执行】按钮,出现如图4.34所示的结果,
【参见光盘文件】:\第4章\4.5\456.sql。
【sign】函数用法:sign(n)。n>0,取1;n=0,取0;n<0,取-1。
4.5.7 【avg】函数
在【命令编辑区】输入“select avg(mgr)平均薪水 from scott.emp;”,然后单击【执行】按钮,出现如图4.35所示的结果。
【参见光盘文件】:\第4章\4.5\457.sql。
【avg】函数用法:avg(字段名),求平均值。要求字段为数值型。
4.5.8 【count】函数
(1)在【命令编辑区】输入“select count(*) 记录总数 from scott.emp;”,然后单击【执行】按钮,出现如图4.36所示的结果。
【参见光盘文件】:\第4章\4.5\458-1.sql。
(2)在【命令编辑区】输入“select count(distinct job ) 工作类别总数 from scott.emp;”,然后单击【执行】按钮,出现如图4.37所示的结果。
【参见光盘文件】:\第4章\4.5\458-2.sql。
【count】函数用法:count(字段名)或count(*),统计总数。
4.5.9 【min】函数
在【命令编辑区】输入“select min(sal) 最少薪水 from scott.emp;”,然后单击【执行】按钮,出现如图4.38所示的结果。
【参见光盘文件】:\第4章\4.5\459.sql。
【min】函数用法:min(字段名),计算数值型字段最小数。
4.5.10 【max】函数
在【命令编辑区】输入“select max(sal) 最高薪水 from scott.emp;”,然后单击【执行】按钮,出现如图4.39所示的结果。
【参见光盘文件】:\第4章\4.5\4510.sql。
【max】函数用法:max(字段名),计算数值型字段最大数。
4.5.11 【sum】函数
在【命令编辑区】输入“select sum(sal) 薪水总和 from scott.emp;”,然后单击【执行】按钮,出现如图4.40所示的结果。
【参见光盘文件】:\第4章\4.5\4511.sql。
【sum】函数用法:sum(字段名),计算数值型字段总和。
通过上面4类查询实例的学习,读者可以举一反三,灵活运用。用SQL进行数据的查询就介绍到这里,下面学习如何录入数据。
前些天在论坛发了一帖:《用ET表格打造更直观的学生成绩分析》(以下简称为《成绩分析》),bbs.wps.cn/thread-21963426-1-1.html,很多坛友对文中所涉及的函数非常感兴趣。今天再发一帖对相关的函数作些解释以作前文的补充。
前文中所涉及的函数主要有这么几个:SUMIF、COUNTIF、SUMPRODUCT、VLOOKUP。这几个函数在成绩分析统计中经常用得到,对于教师来说可谓是有用之极。我们且一一道来。
一、SUMIF函数
SUMIF函数的作用是根据指定条件对若干单元格、区域或引用求和。其语法为SUMIF(用于条件判断的单元格区域,由数字、逻辑表达式等组成的判定条件,为需要求和的单元格、区域或者是引用)。以图1所示表格为例。
图1
我们希望在D13单元格中显示表格中2班学生的语文成绩总分。分析可以看到学生的班级在B2:B11单元格区域,语文成绩则分布在D2:D11单元格区域。所以,根据SUMIF函数的语法,我们只需要在D13单元格输入公式“=SUMIF($B$2:$B$11,“2班”,D2:D11)”就可以了。其中参数“2班”为判断条件,$B$2:$B$11为提供逻辑判断依据的单元格区域,而D2:D11则为实际求和的单元格区域。所以,公式 “=SUMIF($B$2:$B$11,“2班”,D2:D11)”可以翻译为:在B2:B11单元格中值为“2班”的,对其对应的D列单元格数据进行求和。
在《成绩分析》一文中,公式“=SUMIF($B:$B,$Q$3,D:D)”就很容易理解了:在B列中其值与Q3单元格相等的,对其对应的D列单元格进行求和。
二、COUNTIF函数
COUNIT函数的作用是计算区域中满足给定条件的单元格的个数。语法与SUMIF函数类似:COUNTIF(为需要计算其中满足条件的单元格数目的单元格区域,统计条件)。其中统计条件可以为数字、表格式或文本。简单地理解就是COUNTIF(在哪里计数,根据什么计数)。
仍以图1所示表格为例。我们如果输入公式“=COUNTIF($B$2:$B$11,“2班”),那么自然就可以得到B2:B11单元格区域中值为“2班”的单元格数目。所以,D14单元格要统计2班语文平均分就简单多了,只需要输入公式“=D13/COUNTIF($B$2:$B$11,“2 班”)”就OK了。
三、SUMPRODUCT函数
该函数可用于多条件计数,即计算符合2个及以上条件的单元格个数。其语法为SUMPRODUCT((条件1)*(条件2)* (条件…))。如图2所示表格。
图2
我们如果要统计表格中职称为“中高”的男教师数,那么只需要在单元格中输入公式“=SUMPRODUCT((Q2:Q11=“男”)*(R2:R11=“中高”))”即可,
相信对照表格和公式,公式的含义自然就清楚了。
图1所示表格中“班级”在B列,语文成绩在D列。假如要计算2班语文科目的及格率,那么就需要先统计符合两个条件的单元格数目。条件1:B列为“2班”,条件2:D列大于或等于60分。公式“=SUMPRODUCT(($B$2:$B$11=“2班”)*(D2:D11>=60))”就可以满足要求,然后再除以人数(COUNTIF($B$2:$B$11,“2班”))不就是及格率了?
成绩分析统计中的“优秀率”也是这样统计,只是把分数从“60”换成设定的成绩就行了。
四、VLOOKUP函数
VLOOKUP函数的作用是在表格或数值数组的首列查找指定的数值,并由此返回表格或数组当前行中指定列处的数值。其语法是 VLOOKUP(查找值,数据表,列序数,匹配条件)。所谓“查找值”是指需要在数据表第一列中查找的数值,它可以是数值、引用或文字串。“数据表” 为需要在其中查找数据的数据表,可以使用对区域或区域名称的引用。“列序数”是在数据表中待返回匹配数据所在的列序号。“匹配条件”为“FALSE”是返回精确匹配值,如果为TRUE或省略,则返回近似匹配值,也就是说,如果找不到精确匹配值,则返回小于“查找值”的最大数值。
还是举例来说更清楚些。假设我们想知道在图2所示表格中“教师04”的职称是什么。那么我们就可以在单元格中输入公式“=VLOOKUP(“教师04”,P2:R11,3,FALSE)”,回车就出结果了,如图3所示。
图3
公式的含义是在P2:R11单元格区域的首列查找值为“教师04”的单元格,并返回其所在行的第三列数据。对照表格看一下就清楚了。
在《成绩分析》一文中的VLOOKUP函数中,使用了另一函数COLUMN(),它返回的是单元格所在的列数。比如公式“=COLUMN(D3)”的结果就是“4”。而不带任何参数的“COLUMN()”返回的则是当前单元格所在的列数。
好了,《成绩分析》一文中涉及的函数基本交待完了。如何有机会实践一下,必定能体会到使用这些函数的乐趣。