- 浏览: 82200 次
- 性别:
- 来自: 深圳
最新评论
-
tanzizi1210:
非常不错的指导
oracle中去重复记录,不用distinct并可以过hibernate -
ralfsumahe:
与其他区分语言环境的类一样,可以使用静态工厂方法 getIns ...
java中文汉字排序 -
luorongda:
好详细.多谢.
spring中连接池的配置 -
luoli-17:
?????????????
textarea 光标处插入和滚动条移动 -
paul_yunzai:
兄弟。看到你的文章之后,我想说谢谢。帮助我解决了很棘手的问题。 ...
oracle中去重复记录,不用distinct并可以过hibernate
分析函数 : 分析函数用于计算基于组的某种聚合值, 聚合函数对于每个组只返回一行。
row_number(),rank()和dense_rank()的区别是:
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).
与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .
lag(arg1,arg2,arg3):
arg1是从其他行返回的表达式
arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。
arg3是在arg2表示的数目超出了分组的范围时返回的值。
CREATE TABLE TABLE1
( "NAME" VARCHAR2(40 BYTE),
"CLASS" VARCHAR2(40 BYTE),
"SCORE" NUMBER,
"DATE" NUMBER
)
select class, rank()over(partition by class order by score desc) a from table1;
select class,row_number()over(order by class/score asc) as bb from table1;
select class, sum(score)over(partition by class order by class desc) as aa from table1;
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:统计各班成绩第一名的同学信息
----- ----- ----------------------
fda 1 80
ffd 1 78
dss 1 95
cfe 2 74
gds 2 92
gf 3 99
ddd 3 99
通过:
--
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.分类统计 (并显示信息)
-- -- ----------------------
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
得到结果:
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 2000
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)
发表评论
-
oracle 执行计划之sql trace
2010-04-12 15:11 10201.设置init.ora(spfile用户将需要使用alter ... -
oracle 执行计划4
2010-03-02 23:39 838将语句中加入hints,让oracle的优化器使用嵌套循环,并 ... -
oracle 执行计划3
2010-03-02 23:35 851环境:oracle 817 + linux + 阵列柜 ... -
oracle 执行计划2
2010-03-02 23:29 818三.表之间的连接 Join是一种试图将两个表结合在一起 ... -
oracle 执行计划1
2010-03-02 23:28 749一.相关的概念 Rowid的 ... -
dba常用检查脚本
2009-05-26 17:32 932检查警告文件,跟踪文件,备分情况 1.表空间的使用情况: ... -
oracle db 死锁
2008-12-26 18:06 967--查找锁死的session select a.object_ ... -
数字求和问题字符串分组相加
2008-11-08 12:32 2619数字8546把各个位数相加 create or replace ... -
Oracle用Start with...Connect By子句递归查询(2)
2008-11-08 12:25 2236start with ... connect by用法简介 ... -
Oracle用Start with...Connect By子句递归查询(1)
2008-06-18 17:00 3096Start with...Connect By子句递归查询一般 ... -
sql一点点
2008-05-12 14:36 716com.microsoft.sqlserver.jdbc.SQ ... -
sql连接
2008-05-12 13:50 941join_type 指出连接类型,可分为三 ... -
synonym sequence 权限
2008-05-08 12:03 2205Oracle 创建用户 / 密码并授权 (1) ... -
在数据库中存储层次数据
2008-03-31 17:00 1604存储树形结构是一个很常见的问题,他有好几种解决方案。主要有两种 ...
相关推荐
function SearchMemo(Memo: TCustomEdit; const SearchString: string; Options: TFindOptions): Boolean; var Buffer, P: PChar; Size: Word; begin Result := False; if Length(SearchString) = 0 then ...
function LinesVisible(Memo: TMemo): integer; Var OldFont : HFont; Hand : THandle; TM : TTextMetric; Rect : TRect; tempint : integer; begin Hand := GetDC(Memo.Handle); try ...
这是一份oracle的大作业实验报告,里面有源代码以及实验报告。实验报告有20页,包含了整个项目的需求分析,界面实现,核心代码,数据库设计,功能演示等方面。项目是以网上订餐系统为需求,C#为用户界面,Oracle为...
MEMO控件MEMO控件
动态改变FastReport内的Memo内容 Delphi 动态改变FastReport内的Memo内容 Delphi
谁能帮我看看怎么样过滤MEMO字段吗?试验的是ACCESS,实际是SQLITE
MyMemo
Delphi7中Memo组件实现查找替换功能
在memo中实现文字颜色设定,关键词高亮显示
Memo控件的使用方法和详解,比较全面的解释
动态改变FastReport内的Memo内容
C++ builder memo string finding sample. 完整代码+工程。备忘。
当memo内容多时,换行定位类似假死…… 1、内容读进readTxtKeep 2、要查找的关键字KeyStr 3、刷新Memeo显示ss 4、然后根据前面显示的次数、关键字,Memeo定位到需要的位置
Delphi 7 memo 第二版( chm )
Sql语句应用 Sql memo日常查询语句应用 Sql memo日常查询语句应用
Memo";;;是一个能记事和定时提醒的小程序。相对于其它的这类程序,这个程序可算“袖珍”,所有的功能都集中在一个面板上,操作也不算复杂。 面板的上半部分控件用于建立新的条目,在选择好日期、时间后点击...
Memo 是一款小巧的加强版记事本,可以将多个标签页保存为一个项目,非常实用。
35个Delphi7 indy memo
DELPHI中MEMO组件的光标定位.pdf