连续求和与求总和的区别 D 为天,S 为销售业绩为每天计算销售总额。
SELECTSUM(s) OVER (ORDERBY d),
SUM(s) OVER ()
FROM (SELECT\'A\'\"A\",1 D, 20 SFROM DUAL
UNIONALL
SELECT\'A\'\"A\",2 D, 15 SFROM DUAL
UNIONALL
SELECT\'A\'\"A\",3 D, 14 SFROM DUAL
UNIONALL
SELECT\'A\'\"A\",4 D, 18 SFROM DUAL
UNIONALL
SELECT\'A\'\"A\",5 D, 30 SFROM DUAL);
各种求和举例 CREATE TABLETEST_ZHUXP(DEPTNOVARCHAR2(10), ENAME VARCHAR2(10), SAL VARCHAR2(10));--部门姓名薪水
SELECTtest_zhuxp.*,
sum(sal) over (partitionbydeptnoorderbyename) 部门连续求和,--各部门的薪水\"连续\"求和
sum(sal) over (partitionbydeptno) 部门总和,-- 部门统计的总和,同一部门总和不变
100*round(sal/sum(sal) over (partitionbydeptno),4) \"部门份额(%)\", sum(sal) over (orderbydeptnoDESC,ename) 连续求和, --所有部门的薪水\"连续\"求和
sum(sal) over () 总和-- 此处sum(sal) over () 等同于sum(sal),所有员工的薪水总和
100*round(sal/sum(sal) over (),4) \"总份额(%)\"
FROMtest_ZHUXP
注意求和后可以排序不影响结果
SELECT DEPTNO,
ENAME,
SAL,
SUM(SAL) OVER(PARTITIONBY DEPTNO ORDERBY DEPTNO DESC, SAL DESC) 部门连续求和,
SUM(SAL) OVER(ORDERBY DEPTNO DESC, SAL DESC)公司连续求和
FROM TEST_ZHUXP
排序
1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果
2.rank()和dense_rank()的区别是:
rank()是跳跃排序,有两个第二名时接下来就是第四名dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
SELECTt.*,
RANK()OVER(PARTITIONBYCLASSORDERBY S DESC),
dense_rank()OVER(PARTITIONBYCLASSORDERBY S DESC),
ROW_NUMBER()OVER(PARTITIONBYCLASSORDERBY S DESC)
FROM (SELECT\'a\' \"NAME\",1 \"CLASS\",80 \"S\"FROM DUAL
UNIONALL
SELECT\'b\' \"NAME\",1 \"CLASS\",89 \"S\" FROM DUAL
UNIONALL
SELECT\'c\' \"NAME\",1 \"CLASS\",89 \"S\" FROM DUAL
UNIONALL
SELECT\'e\' \"NAME\",3 \"CLASS\",100 \"S\" FROM DUAL
UNIONALL
SELECT\'f\' \"NAME\",3 \"CLASS\",100 \"S\" FROM DUAL
UNIONALL
SELECT\'g\' \"NAME\",3 \"CLASS\",79 \"S\" FROM DUAL) t
统计
和group by的区别是可以看到每一行数据的所有信息
注意加NAME后的区别
SELECTt.*,
SUM(1)OVER(PARTITIONBYCLASSORDERBYCLASS/*NAME*/)
FROM (SELECT\'a\' \"NAME\",1 \"CLASS\",80 \"S\"FROM DUAL
UNIONALL
SELECT\'b\' \"NAME\",1 \"CLASS\",89 \"S\" FROM DUAL
UNIONALL
SELECT\'c\' \"NAME\",1 \"CLASS\",89 \"S\" FROM DUAL
UNION ALL
SELECT\'e\' \"NAME\",1 \"CLASS\",100 \"S\" FROM DUAL
UNION ALL
SELECT\'f\' \"NAME\",3 \"CLASS\",100 \"S\" FROM DUAL
UNION ALL
SELECT\'g\' \"NAME\",3 \"CLASS\",79 \"S\" FROM DUAL) t
开窗函数
开窗函数
开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
1:
over(orderby xxx)按照xxx排序进行累计,order by是个默认的开窗函数
over(partitionbyxxx)按照部门分区
2:
over(orderby salary rangebetween5precedingand5following)
每行对应的数据窗口是之前行幅度值不超过5,之后行幅度值不超过5
例如:对于以下列
aa
6
7
9
sum(aa)over(orderbyaarangebetween2precedingand2following)
得出的结果是
AASUM
110
214
214
214
318
418
522
618
722
99
就是说,对于aa=5的一行,sum为5-1
对于aa=2来说,sum=1+2+2+2+3+4=14;
又如对于aa=9,9-1
3:其它:
over(orderby salary rowsbetween2precedingand4following)
每行对应的数据窗口是之前2行,之后4行
4:下面三条语句等效:
over(orderby salary rowsbetweenunboundedprecedingandunboundedfollowing) 每行对应的数据窗口是从第一行到最后一行,等效:
over(orderby salary
rangebetweenunboundedprecedingandunboundedfollowing)
等效over(partitionbynull)
任意删除重复行
在这个表中如果cla与score相同,就考虑这行数据多余,删除多余行,就随便保留一行。
NAMECLASSSCORE
---------- ---------- ----------
1.ff197
2.gg189
3.ll196
4.jj289
5.oo287
6.ii198
7.kk293
8.uu397
9.rr395
10.ee392
11.yy290
12.mm4100
13.nn498
14.pp198
15.fft197
16.ggt189
17.oot287
18.kkt293
19.ffff197
SQL> delete from c_score t where rowid in(select rowid from (select rowid ,row_number() over (partition by cla,score order by cla)dup_num from c_score)t where t.dup_num>1);
Android的getSystemService函数学习总结