update T05_Evt_Pay a set partyid = T05_ARREAR_AGMT.partyid
where a.OWEAgmtNum = T05_ARREAR_AGMT.OWEAgmtNum
and T05_ARREAR_AGMT.partyid <> ''
and T05_ARREAR_AGMT.partyid = ''
set治ñambiguous
update T05_Evt_Pay a set partyid = T05_ARREAR_AGMT.partyid
where a.OWEAgmtNum = T05_ARREAR_AGMT.OWEAgmtNum
and T05_ARREAR_AGMT.partyid <> ''
and T05_ARREAR_AGMT.partyid = ''
set治ñambiguous
УǿܻᾭCPUʹöӰϵͳܻе⡣£ϵͳⶼɲSQLģôΪDBAֺͽЩSQLԵΪҪ
ͨһϵͳеİʹ̷ϣܹҴһá
:
ҵԱϵͳлѾӰҵϵͳʹáЭϡ
1ʹvmstatϵͳǰ
ȵ½ݿ鵱ǰϵͳ״
ʹvmstat飬CPUԴѾľλжУ
bash-2.03$ vmstat 3
procs memory page disk faults cpu
r b w swap free re mf pi po fr de sr s6 s9 s1 sd in sy cs us sy id
0 0 0 5504232 1464112 0 0 0 0 0 0 0 0 1 1 0 4294967196 0 0 -84 -5 -145
131 0 0 5368072 1518360 56 691 0 2 2 0 0 0 1 0 0 3011 7918 2795 97 3 0
131 0 0 5377328 1522464 81 719 0 2 2 0 0 0 1 0 0 2766 8019 2577 96 4 0
130 0 0 5382400 1524776 67 682 0 0 0 0 0 0 0 0 0 3570 8534 3316 97 3 0
134 0 0 5373616 1520512 127 1078 0 2 2 0 0 0 1 0 0 3838 9584 3623 96 4 0
136 0 0 5369392 1518496 107 924 0 5 5 0 0 0 0 0 0 2920 8573 2639 97 3 0
132 0 0 5364912 1516224 63 578 0 0 0 0 0 0 0 0 0 3358 7944 3119 97 3 0
129 0 0 5358648 1511712 189 1236 0 0 0 0 0 0 0 0 0 3366 10365 3135 95 5 0
129 0 0 5354528 1511304 120 1194 0 0 0 0 0 0 0 4 0 3235 8864 2911 96 4 0
ʱϵͳCPUԴѾľIdleΪ0ждŶӵȴ
2ʹTop߸
ͨTopߣǿԲ鿴CPUڽ쳣ͨTopλΪһṩݡ
ڱ۲CPUãûԹCPUʹõĽ̡
$ top
last pid: 28313; load averages: 99.90, 117.54, 125.71 23:28:38
296 processes: 186 sleeping, 99 running, 2 zombie, 9 on cpu
CPU states: 0.0% idle, 96.5% user, 3.5% kernel, 0.0% iowait, 0.0% swap
Memory: 4096M real, 1404M free, 2185M swap in use, 5114M swap free
PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU COMMAND
27082 oracle8i 1 33 0 1328M 1309M run 0:17 1.29% oracle
26719 oracle8i 1 55 0 1327M 1306M sleep 0:29 1.11% oracle
28103 oracle8i 1 35 0 1327M 1304M run 0:06 1.10% oracle
28161 oracle8i 1 25 0 1327M 1305M run 0:04 1.10% oracle
26199 oracle8i 1 45 0 1328M 1309M run 0:42 1.10% oracle
26892 oracle8i 1 33 0 1328M 1310M run 0:24 1.09% oracle
27805 oracle8i 1 45 0 1327M 1306M cpu/1 0:10 1.04% oracle
23800 oracle8i 1 23 0 1327M 1306M run 1:28 1.03% oracle
25197 oracle8i 1 34 0 1328M 1309M run 0:57 1.03% oracle
21593 oracle8i 1 33 0 1327M 1306M run 2:12 1.01% oracle
TopǷд̴running״̬CPUĺƽĴԼ1%ңǻų쳣CPUĿܡ
3
һݿϵͳȶеĽͨǿ֪ġ
ʾ:ȶеϵͳݿ״ͨȶģƳߣᷢÿڵǿغϵģݿϵͳ״ָгʶ˽DZġ
ǿһµǰϵͳĽӶбȽжϣ
bash-2.03$ ps -ef|grep ora|wc -l
258
bash-2.03$ ps -ef|grep ora|wc -l
275
bash-2.03$ ps -ef|grep ora|wc -l
274
bash-2.03$ ps -ef|grep ora|wc -l
278
bash-2.03$ ps -ef|grep ora|wc -l
277
bash-2.03$ ps -ef|grep ora|wc -l
366
ִʱϵͳڴOracle,Լ300ң˼CPUԴ,OracleӦ100ҡ
ɴˣǿԻжϣݿӦó⣬½ɣۻӶִеȴ
ЩȴݿӦо֣Ҫ½ݿмˡ
4½ݿ
жݿܾ˵ȴôOracleݿṩͼDzѯͷ⣬v$session_waitֵǹעġ
ѯv$session_waitȡ̵ȴ¼
SQL> select sid,event,p1,p1text from v$session_wait;
SID EVENT P1 P1TEXT
---------- ------------------------------ ---------- ----------------------------------------------------------------
124 latch free 1.6144E+10 address
1 pmon timer 300 duration
2 rdbms ipc message 300 timeout
140 buffer busy waits 17 file#
66 buffer busy waits 17 file#
10 db file sequential read 17 file#
18 db file sequential read 17 file#
54 db file sequential read 17 file#
49 db file sequential read 17 file#
48 db file sequential read 17 file#
46 db file sequential read 17 file#
45 db file sequential read 17 file#
234 db file sequential read 17 file#
233 db file sequential read 17 file#
230 db file sequential read 17 file#
333 db file sequential read 17 file#
330 db file scattered read 17 file#
310 db file scattered read 17 file#
244 rows selected.
ڱǷִڴdb file scattered readdb file sequential readȴȻȫɨȲΪϵͳصӰء
5SQL
ȷЩΪݷʲ˵ȴǿDzЩSQLԷ⡣
õҵ½űgetsqlbysid.sqlýű֪ͨsessionsidv$sessionv$sqltextͼsessionִеSQL䡣
SELECT sql_text
FROM v$sqltext a
WHERE a.hash_value = (SELECT sql_hash_value
FROM v$session b
WHERE b.SID = '&sid')
ORDER BY piece ASC
/
ʹøýű,ͨv$session_waitлõĵȴȫɨĽSIDԲܴsql:
SQL> @getsqlbysid
Enter value for sid: 18
old 5: where b.sid='&sid'
new 5: where b.sid='18'
SQL_TEXT
----------------------------------------------------------------
select i.vc2title,i.numinfoguid from hs_info i where i.intenab
ledflag = 1 and i.intpublishstate = 1 and i.datpublishdate <=
sysdate and i.numcatalogguid = 2047 order by i.datpublishdate d
esc, i.numorder desc
SQL> /
Enter value for sid: 54
old 5: where b.sid='&sid'
new 5: where b.sid='54'
SQL_TEXT
----------------------------------------------------------------
select i.vc2title,i.numinfoguid from hs_info i where i.intenab
ledflag = 1 and i.intpublishstate = 1 and i.datpublishdate <=
sysdate and i.numcatalogguid = 33 order by i.datpublishdate des
c, i.numorder desc
Լ̽и,ֱõSQL䣬ЩSQLܾĸԴ
ʹøӦûӣͨautotraceܼSQLִмƻ:
SQL> set autotrace trace explain
SQL> select i.vc2title,i.numinfoguid
2 from hs_info i where i.intenabledflag = 1
3 and i.intpublishstate = 1 and i.datpublishdate <=sysdate
4 and i.numcatalogguid = 3475
5 order by i.datpublishdate desc, i.numorder desc ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=228 Card=1 Bytes=106)
1 0 SORT (ORDER BY) (Cost=228 Card=1 Bytes=106)
2 1 TABLE ACCESS (FULL) OF 'HS_INFO' (Cost=218 Card=1 Bytes=106)
SQL> select count(*) from hs_info;
COUNT(*)
----------
227404
ִͨмƻǿϲѯʹȫɨ裬ñ22¼ȫɨѾʺϡ
Ǽȫɨݱִ:
SQL> select index_name,index_type from user_indexes where table_name='HS_INFO';
INDEX_NAME INDEX_TYPE
------------------------------ ---------------------------
HSIDX_INFO1 FUNCTION-BASED NORMAL
HSIDX_INFO_SEARCHKEY DOMAIN
PK_HS_INFO NORMAL
ֵ
SQL> select index_name,column_name
2 from user_ind_columns where table_name ='HS_INFO';
INDEX_NAME COLUMN_NAME
------------------------------ --------------------
HSIDX_INFO1 NUMORDER
HSIDX_INFO1 SYS_NC00024$
HSIDX_INFO_SEARCHKEY VC2INDEXWORDS
PK_HS_INFO NUMINFOGUID
SQL> desc hs_info
Name Null? Type
--------------------------------- -------- --------------------------------------------
NUMINFOGUID NOT NULL NUMBER(15)
NUMCATALOGGUID NOT NULL NUMBER(15)
INTTEXTTYPE NOT NULL NUMBER(38)
VC2TITLE NOT NULL VARCHAR2(60)
VC2AUTHOR VARCHAR2(100)
NUMPREVINFOGUID NUMBER(15)
NUMNEXTINFOGUID NUMBER(15)
NUMORDER NOT NULL NUMBER(15)
6µȫɨ
鷢numcatalogguidֶϲû,ֶξкܺõֶȣڸֶδȫɨ衣
SQL> create index hs_info_NUMCATALOGGUID on hs_info(NUMCATALOGGUID);
Index created.
SQL> set autotrace trace explain
SQL> select i.vc2title,i.numinfoguid
2 from hs_info i where i.intenabledflag = 1
3 and i.intpublishstate = 1 and i.datpublishdate <=sysdate
4 and i.numcatalogguid = 3475
5 order by i.datpublishdate desc, i.numorder desc ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12 Card=1 Bytes=106)
1 0 SORT (ORDER BY) (Cost=12 Card=1 Bytes=106)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'HS_INFO' (Cost=2 Card=1 Bytes=106)
3 2 INDEX (RANGE SCAN) OF 'HS_INFO_NUMCATALOGGUID' (NON-UNIQUE) (Cost=1 Card=1)
7۲ϵͳ״
ԭȴʧ
SQL> select sid,event,p1,p1text from v$session_wait where event not like 'SQL%';
SID EVENT P1 P1TEXT
---------- ------------------------------ ---------- ----------------------------------------------------------------
1 pmon timer 300 duration
2 rdbms ipc message 300 timeout
3 rdbms ipc message 300 timeout
6 rdbms ipc message 180000 timeout
59 rdbms ipc message 6000 timeout
118 rdbms ipc message 6000 timeout
275 rdbms ipc message 30000 timeout
147 rdbms ipc message 6000 timeout
62 rdbms ipc message 6000 timeout
11 rdbms ipc message 30000 timeout
4 rdbms ipc message 300 timeout
305 db file sequential read 17 file#
356 db file sequential read 17 file#
19 db file scattered read 17 file#
5 smon timer 300 sleep time
15 rows selected.
session۲CPUʹ
bash-2.03$ vmstat 3
procs memory page disk faults cpu
r b w swap free re mf pi po fr de sr s6 s9 s1 sd in sy cs us sy id
34 0 0 5343016 1465416 44 386 77 0 0 0 0 0 0 0 0 3197 8486 2902 92 8 0
31 0 0 5331568 1459696 178 1491 122 0 0 0 0 0 0 3 0 3237 9461 3005 89 11 0
31 0 0 5317792 1453008 76 719 80 0 0 0 0 0 0 0 0 3292 8736 3025 93 7 0
31 2 0 5311144 1449552 235 1263 69 2 2 0 0 0 1 0 0 3473 9535 3357 88 12 0
25 0 0 5300240 1443920 108 757 18 2 2 0 0 0 1 1 0 2377 7876 2274 95 5 0
19 0 0 5295904 1441840 50 377 0 0 0 0 0 0 0 1 0 1915 6598 1599 98 1 0
----Ϊ֮ǰ
----Ϊ֣֮CPUʹʻָ
procs memory page disk faults cpu
r b w swap free re mf pi po fr de sr s6 s9 s1 sd in sy cs us sy id
0 0 0 4955872 1287136 737 6258 16 0 0 0 0 0 0 3 0 2890 11777 4432 44 12 44
1 0 0 4887888 1256464 809 6234 8 2 2 0 0 0 0 2 0 2809 12066 4247 45 12 43
0 0 0 4828912 1228200 312 2364 13 5 5 0 0 0 2 1 0 2410 6816 3492 38 6 57
0 0 0 4856816 1240168 8 138 0 0 0 0 0 0 1 0 0 2314 4026 3232 34 4 62
0 0 0 4874176 1247712 0 86 0 0 0 0 0 0 0 0 0 2298 3930 3324 35 2 63
2 0 0 4926088 1270824 34 560 0 0 0 0 0 0 0 0 0 2192 4694 2612 29 16 55
0 0 0 5427320 1512952 53 694 0 0 0 0 0 0 3 2 0 2443 5085 3340 33 12 55
0 0 0 5509120 1553136 0 37 0 0 0 0 0 0 0 0 0 2309 3908 3321 35 1 64
ˣԽ
8ܺ
شƺǶ,ֻһ:
ЧĽSQLSQLŻĻԭ֮һ
Ƚһǰִзʽȡܲ졣
a. ȫɨ
SQL> select i.vc2title,i.numinfoguid
2 from hs_info i where i.intenabledflag = 1
3 and i.intpublishstate = 1 and i.datpublishdate <=sysdate
4 and i.numcatalogguid = 3475
5 order by i.datpublishdate desc, i.numorder desc ;
352 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=541 Card=1 Bytes=106)
1 0 SORT (ORDER BY) (Cost=541 Card=1 Bytes=106)
2 1 TABLE ACCESS (FULL) OF 'HS_INFO' (Cost=531 Card=1 Bytes=106)
Statistics
----------------------------------------------------------
0 recursive calls
25 db block gets
3499 consistent gets
258 physical reads
0 redo size
..
2 sorts (memory)
0 sorts (disk)
352 rows processed
b. ʹ
SQL> select i.vc2title,i.numinfoguid
2 from hs_info i where i.intenabledflag = 1
3 and i.intpublishstate = 1 and i.datpublishdate <=sysdate
4 and i.numcatalogguid = 3475
5 order by i.datpublishdate desc, i.numorder desc;
352 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12 Card=1 Bytes=106)
1 0 SORT (ORDER BY) (Cost=12 Card=1 Bytes=106)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'HS_INFO' (Cost=2 Card=1 Bytes=106)
3 2 INDEX (RANGE SCAN) OF 'HS_INFO_NUMCATALOGGUID' (NON-UNIQUE) (Cost=1 Card=1)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
89 consistent gets
0 physical reads
0 redo size
.
1 sorts (memory)
0 sorts (disk)
352 rows processed
consistent gets3499 89,ǿܵõ˾.
ͨ,ԱעSQLЧ,Ǹڹܵʵ֡
ͨΪǴҪ,Ӧϵͳ,ݿ,ڲѯSQL,SQL䷨ܲ졣
һЩӦΪϵͳ,ݿ,,ϵͳӦٶȿܾͻΪϵͳҪҪ֮һ
ûܿԽܵSQLڴû¾ͻΪƿ
УԱŽֻһSQL͵ݿ½ȻʵˣһЧSQLͿܻٵݿ⣬ϵͳƼУ뿼ǵϸڣϸIJҲ緢Ч
ϻڶԣôDBA(Ҳ)һܹٵϲָ⡣
OracleGROUP BY⣬֧ROLLUPCUBE䡣
⣬㻹ɲο
οֲ http://xsb.itpub.net/post/419/33028
ʹӽܣhttp://xsb.itpub.net/post/419/44634
SQL> create table t as select * from dba_indexes;
Ѵ
SQL> select index_type, status, count(*) from t group by index_type, status;
INDEX_TYPE STATUS COUNT(*)
--------------------------- -------- ----------
LOB VALID 51
NORMAL N/A 25
NORMAL VALID 479
CLUSTER VALID 11
ROLLUPCUBEִн
SQL> select index_type, status, count(*) from t group by rollup(index_type, status);
INDEX_TYPE STATUS COUNT(*)
--------------------------- -------- ----------
LOB VALID 51
LOB 51
NORMAL N/A 25
NORMAL VALID 479
NORMAL 504
CLUSTER VALID 11
CLUSTER 11
566
ѡ8С
SQL> select index_type, status, count(*) from t group by cube(index_type, status);
INDEX_TYPE STATUS COUNT(*)
--------------------------- -------- ----------
566
N/A 25
VALID 541
LOB 51
LOB VALID 51
NORMAL 504
NORMAL N/A 25
NORMAL VALID 479
CLUSTER 11
CLUSTER VALID 11
ѡ10С
ѯǺһĿȻͨOracleṩĺGROUPINGһ²ѯ
SQL> select grouping(index_type) g_ind, grouping(status) g_st, index_type, status, count(*)
2 from t group by rollup(index_type, status) order by 1, 2;
G_IND G_ST INDEX_TYPE STATUS COUNT(*)
---------- ---------- --------------------------- -------- ----------
0 0 LOB VALID 51
0 0 NORMAL N/A 25
0 0 NORMAL VALID 479
0 0 CLUSTER VALID 11
0 1 LOB 51
0 1 NORMAL 504
0 1 CLUSTER 11
1 1 566
ѡ8С
ѯֱ۶ˣͲROLLUPGROUP BYȣROLLUP˶INDEX_TYPEGROUP BYͳƺͶм¼GROUP BYͳơ
Ҳ˵ROLLUP(A, B, C)ĻȻ(ABC)GROUP BYȻ(AB)GROUP BYȻ(A)GROUP BYȫGROUP BY
濴CUBE䡣
SQL> select grouping(index_type) g_ind, grouping(status) g_st, index_type, status, count(*)
2 from t group by cube(index_type, status) order by 1, 2;
G_IND G_ST INDEX_TYPE STATUS COUNT(*)
---------- ---------- --------------------------- -------- ----------
0 0 LOB VALID 51
0 0 NORMAL N/A 25
0 0 NORMAL VALID 479
0 0 CLUSTER VALID 11
0 1 LOB 51
0 1 NORMAL 504
0 1 CLUSTER 11
1 0 N/A 25
1 0 VALID 541
1 1 566
ѡ10С
ROLLUPȣCUBE˶STATUSеGROUP BYͳơ
GROUP BY CUBE(A, B, C)Ȼ(ABC)GROUP BYȻ(AB)(AC)(A)(BC)(B)(C)ȫGROUP BY
ʹGROUPINGʹGROUPING_IDʶGROUP BY
SQL> select grouping_id(index_type, status) g_ind, index_type, status, count(*)
2 from t group by rollup(index_type, status) order by 1;
G_IND INDEX_TYPE STATUS COUNT(*)
---------- --------------------------- -------- ----------
0 LOB VALID 51
0 NORMAL N/A 25
0 NORMAL VALID 479
0 CLUSTER VALID 11
1 LOB 51
1 NORMAL 504
1 CLUSTER 11
3 566
ѡ8С
SQL> select grouping_id(index_type, status) g_ind, index_type, status, count(*)
2 from t group by cube(index_type, status) order by 1;
G_IND INDEX_TYPE STATUS COUNT(*)
---------- --------------------------- -------- ----------
0 LOB VALID 51
0 NORMAL N/A 25
0 NORMAL VALID 479
0 CLUSTER VALID 11
1 LOB 51
1 NORMAL 504
1 CLUSTER 11
2 N/A 25
2 VALID 541
3 566
ѡ10С
grouping_id()Ч
select DECODE(GROUPING_ID(C1), 1, 'ϼ', C1) D1,
DECODE(GROUPING_ID(C1, C2), 1, 'С', C2) D2,
DECODE(GROUPING_ID(C1, C2, C1 + C2), 1, 'С', C1 + C2) D3,
count(*),
GROUPING_ID(C1, C2, C1 + C2, C1 + 1, C2 + 1),
GROUPING_ID(C1)
from T2
group by rollup(C1, C2, C1 + C2, C1 + 1, C2 + 1);
===========================================================
1.ϼרõRollup
۱
1 2000Ԫ
2 2500Ԫ
4500Ԫ
1 1000Ԫ
2 2000Ԫ
3000Ԫ
е 7500Ԫ
IJѯSQL:
Select area,month,sum(money) from SaleOrder group by area,month
ȻݣڵĺϼƺеϼƶҪڳۼ
1.ʵʹSQL:
Select area,month,sum(total_sale) from SaleOrder group by rollup(area,month)
ܲͱһģһļ¼
2.yearۼӣд
Select year,month,area,sum(total_sale) from SaleOrder group by year, rollup(month,area)
Oracle 9i֧:
Select year,month,area,sum(total_sale) from SaleOrder group by rollup((year,month),area)
3.ʹCube(area,month)RollUp(area,month)˻ÿĺϼ֮⣬ÿ·ݵĺϼƣڱʾ
4.Groupingúϼиö
RollUpʾݺϼʱ·ΪNULLõӦʾΪ"·"
GroupingжϵǰColumnǷһϼУ1ΪyesȻDecodeתΪ"·"
Select Decode(Grouping(area),1,'е',area) area, Decode(Grouping(month),1,'·',month), sum(money) From SaleOrder Group by RollUp(area,month);
2.Զ༶βѯstart with.....connect by
Ա֯,Ʒ,Oracleṩ˺ܾķ
SELECT LEVEL, name, emp_id,manager_emp_id FROM employee START WITH manager_emp_id is null CONNECT BY PRIOR emp_id = manager_emp_id;
demoȫӦ,start withָ↑ʼ,Ӹʼ,ômanagerӦNull,ijְԱʼ,дemp_id='11'
CONNECT BY ָӹϵ,עPRIORλ
һLEVEL,ʾڵIJ
3.౨/߹
3.1 ܵĻṹ
() over( partionӾ,order byӾ,Ӿ)
Ϻѽ,˵ȽϺ.
3.2 Row_Number Rank, DENSE_Rank
ѡTop 3 salesı
ҵԱͬҵʱ,ҪʹRankDense_Rank
RowNum Rank Dense_Rank
4000Ԫ 1 1 1
3000Ԫ 2 2 2
Ǯ 2000Ԫ 3 3 3
2000Ԫ 4 3 3
1000Ԫ 5 5 4
ʱ,ӦðѲеǮѡȥ,RankingܱRowNumber.DesnseRankingͿˡ
SELECT salesperson_id, SUM(tot_sales) sp_sales, RANK( ) OVER (ORDER BY SUM(tot_sales) DESC) sales_rank FROM orders GROUP BY salesperson_id
3.3 NTILE Ѽ¼ƽֳɼұĵ
ȡǰ25%ļ¼,߰25%ļ¼ͬһlevelƽȶԴ,25%һLevelƽȶԴ
SELECT cust_nbr, SUM(tot_sales) cust_sales, NTILE(4) OVER (ORDER BY SUM(tot_sales) DESC) sales_quartile FROM orders GROUP BY cust_nbr ORDER BY 3,2 DESC;
NTITLE(4)Ѽ¼ SUM(tot_sales)ֳ4.
3.4 кWindows Function
˻ʵ,ϣԱ߶Щȫ,ĿǰΪֹۼ,ǰµƽο.
ǰµƽ͵ĿǰΪֹۼͽwindows function,
SELECT month, SUM(tot_sales) monthly_sales, SUM(SUM(tot_sales)) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_preceeding FROM orders GROUP BY month ORDER BY month;
SELECT month, SUM(tot_sales) monthly_sales, AVG(SUM(tot_sales)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) rolling_avg FROM orders GROUP BY month ORDER BY month;
Windows FunctionĹؼWindowsӾļȡֵ
1 PRECEDING ֮ǰһ¼
1 FOLLOWING ֮һ¼
UNBOUNDED PRECEDING ֮ǰм¼
CURRENT ROW ǰ¼
4.SubQueryܽ
SubQuery,ܽһ.SubQuery
1.Noncorrelated Ӳѯ ͨʽ.
2.Correlated Subqueries ѸѯӲѯȥ,ͷһcytҵʱ˰.
3.Inline View Ҳͨʽ.
ȻNoncorrelated Ӳѯ
1.һһ where price < (select max(price) from goods )
2.ضһ where price>= ALL (select price from goods where type=2)
or where NOT price< ANY(select price from goods where type=2)
õINʵ=ANY()
3.ضж һηضеȻͽʡ˲ѯʱ
UPDATE monthly_orders SET (tot_orders, max_order_amt) = (SELECT COUNT(*), MAX(sale_price) FROM cust_order) DELETE FROM line_item WHERE (order_nbr, part_nbr) IN (SELECT order_nbr, part_nbr FROM cust_order c)
========================================
/*--------grouping sets
select a, b, c, sum( d ) from t
group by grouping sets ( a, b, c )
Ч
select * from (
select a, null, null, sum( d ) from t group by a
union all
select null, b, null, sum( d ) from t group by b
union all
select null, null, c, sum( d ) from t group by c
)
*/
Ҫҽһ¼ʹ÷
1. Զܺrollup,cube,
2. rank , rank,dense_rank,row_number
3. lag,lead
4. sum,avg,ƶ,ƶƽ
5. ratio_to_report
6. first,lastȡ
| Code: | ||
| ||
| Quote: | |
|
SELECT d.department_id , e.last_name, e.salary, RANK()
OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND d.department_id IN ('60', '90');
DEPARTMENT_ID LAST_NAME SALARY DRANK
------------- ------------------------- ---------- ----------
60 Lorentz 4200 1
60 Austin 4800 2
60 Pataballa 4800 2
60 Ernst 6000 4
60 Hunold 9000 5
90 Kochhar 17000 1
90 De Haan 17000 1
90 King 24000 3
RATIO_TO_REPORT
úexpression/(sum(expression))ֵİٷֱȣǰжsum(expression)Ĺס
SAMPLEÿԱĹռԱܹʵİٷֱ
SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr
FROM employees
WHERE job_id = 'PU_CLERK';
LAST_NAME SALARY RR
------------------------- ---------- ----------
Khoo 3100 .223021583
Baida 2900 .208633094
Tobias 2800 .201438849
Himuro 2600 .18705036
Colmenares 2500 .179856115
REGR_ (Linear Regression) Functions
ЩԻع麯ʺС˷عߣ9ͬĻع麯ʹá
REGR_SLOPEбʣCOVAR_POP(expr1, expr2) / VAR_POP(expr2)
REGR_INTERCEPTػعߵyؾ࣬
AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2)
REGR_COUNTعߵķǿֶԵĿ
REGR_R2ػعߵľϵʽΪ
If VAR_POP(expr2) = 0 then return NULL
If VAR_POP(expr1) = 0 and VAR_POP(expr2) != 0 then return 1
If VAR_POP(expr1) > 0 and VAR_POP(expr2 != 0 then
return POWER(CORR(expr1,expr),2)
REGR_AVGXعߵԱ(expr2)ƽֵȥ˿ն(expr1, expr2)AVG(expr2)
REGR_AVGYعߵӦ(expr1)ƽֵȥ˿ն(expr1, expr2)AVG(expr1)
REGR_SXX ֵREGR_COUNT(expr1, expr2) * VAR_POP(expr2)
REGR_SYY ֵREGR_COUNT(expr1, expr2) * VAR_POP(expr1)
REGR_SXY: ֵREGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2)
ӶSHûɵģ
SAMPLE 11998ֲƷ260270ĩѿƱۻбʺͻعߵĽؾ
SELECT t.fiscal_month_number "Month", t.day_number_in_month "Day",
REGR_SLOPE(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_SLOPE,
REGR_INTERCEPT(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_ICPT
FROM sales s, times t
WHERE s.time_id = t.time_id
AND s.prod_id IN (270, 260)
AND t.fiscal_year=1998
AND t.fiscal_week_number IN (50, 51, 52)
AND t.day_number_in_week IN (6,7)
ORDER BY t.fiscal_month_desc, t.day_number_in_month;
Month Day CUM_SLOPE CUM_ICPT
---------- ---------- ---------- ----------
12 12 -68 1872
12 12 -68 1872
12 13 -20.244898 1254.36735
12 13 -20.244898 1254.36735
12 19 -18.826087 1287
12 20 62.4561404 125.28655
12 20 62.4561404 125.28655
12 20 62.4561404 125.28655
12 20 62.4561404 125.28655
12 26 67.2658228 58.9712313
12 26 67.2658228 58.9712313
12 27 37.5245541 284.958221
12 27 37.5245541 284.958221
12 27 37.5245541 284.958221
SAMPLE 219984ÿۻ
SELECT UNIQUE t.day_number_in_month,
REGR_COUNT(s.amount_sold, s.quantity_sold)
OVER (PARTITION BY t.fiscal_month_number ORDER BY t.day_number_in_month)
"Regr_Count"
FROM sales s, times t
WHERE s.time_id = t.time_id
AND t.fiscal_year = 1998 AND t.fiscal_month_number = 4;
DAY_NUMBER_IN_MONTH Regr_Count
------------------- ----------
1 825
2 1650
3 2475
4 3300
.
.
.
26 21450
30 22200
SAMPLE 31998ÿѿƱۻع߾ϵ
SELECT t.fiscal_month_number,
REGR_R2(SUM(s.amount_sold), SUM(s.quantity_sold))
OVER (ORDER BY t.fiscal_month_number) "Regr_R2"
FROM sales s, times t
WHERE s.time_id = t.time_id
AND t.fiscal_year = 1998
GROUP BY t.fiscal_month_number
ORDER BY t.fiscal_month_number;
FISCAL_MONTH_NUMBER Regr_R2
------------------- ----------
1
2 1
3 .927372984
4 .807019972
5 .932745567
6 .94682861
7 .965342011
8 .955768075
9 .959542618
10 .938618575
11 .880931415
12 .882769189
SAMPLE 4199812ܲƷ260ѿƱۻƽֵ
SELECT t.day_number_in_month,
REGR_AVGY(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month)
"Regr_AvgY",
REGR_AVGX(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month)
"Regr_AvgX"
FROM sales s, times t
WHERE s.time_id = t.time_id
AND s.prod_id = 260
AND t.fiscal_month_desc = '1998-12'
AND t.fiscal_week_number IN (51, 52)
ORDER BY t.day_number_in_month;
DAY_NUMBER_IN_MONTH Regr_AvgY Regr_AvgX
------------------- ---------- ----------
14 882 24.5
14 882 24.5
15 801 22.25
15 801 22.25
16 777.6 21.6
18 642.857143 17.8571429
18 642.857143 17.8571429
20 589.5 16.375
21 544 15.1111111
22 592.363636 16.4545455
22 592.363636 16.4545455
24 553.846154 15.3846154
24 553.846154 15.3846154
26 522 14.5
27 578.4 16.0666667
SAMPLE 5Ʒ26027019982ĩѿƱۻREGR_SXY, REGR_SXX, and REGR_SYYͳֵ
SELECT t.day_number_in_month,
REGR_SXY(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_sxy",
REGR_SYY(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_syy",
REGR_SXX(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_sxx"
FROM sales s, times t
WHERE s.time_id = t.time_id
AND prod_id IN (270, 260)
AND t.fiscal_month_desc = '1998-02'
AND t.day_number_in_week IN (6,7)
ORDER BY t.day_number_in_month;
DAY_NUMBER_IN_MONTH Regr_sxy Regr_syy Regr_sxx
------------------- ---------- ---------- ----------
1 18870.4 2116198.4 258.4
1 18870.4 2116198.4 258.4
1 18870.4 2116198.4 258.4
1 18870.4 2116198.4 258.4
7 18870.4 2116198.4 258.4
8 18870.4 2116198.4 258.4
14 18870.4 2116198.4 258.4
15 18870.4 2116198.4 258.4
21 18870.4 2116198.4 258.4
22 18870.4 2116198.4 258.4
ROW_NUMBER
һеƫӶڰضкš
SAMPLEÿԱÿаԱ˳
SELECT department_id, last_name, employee_id, ROW_NUMBER()
OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id
FROM employees
WHERE department_id < 50;
DEPARTMENT_ID LAST_NAME EMPLOYEE_ID EMP_ID
------------- ------------------------- ----------- ----------
10 Whalen 200 1
20 Hartstein 201 1
20 Fay 202 2
30 Raphaely 114 1
30 Khoo 115 2
30 Baida 116 3
30 Tobias 117 4
30 Himuro 118 5
30 Colmenares 119 6
40 Mavris 203 1
STDDEV
㵱ǰйıƫ롣Standard Deviation
SAMPLEز30Ӷнˮֵۻƫ
SELECT last_name, hire_date,salary,
STDDEV(salary) OVER (ORDER BY hire_date) "StdDev"
FROM employees
WHERE department_id = 30;
LAST_NAME HIRE_DATE SALARY StdDev
------------------------- ---------- ---------- ----------
Raphaely 07-12-94 11000 0
Khoo 18-5 -95 3100 5586.14357
Tobias 24-7 -97 2800 4650.0896
Baida 24-12-97 2900 4035.26125
Himuro 15-11-98 2600 3649.2465
Colmenares 10-8 -99 2500 3362.58829
STDDEV_POP
úƫ룬ƽ䷵ֵVAR_POPƽͬStandard DeviationPopulation
SAMPLEز203060нˮֵƫ
SELECT department_id, last_name, salary,
STDDEV_POP(salary) OVER (PARTITION BY department_id) AS pop_std
FROM employees
WHERE department_id in (20,30,60);
DEPARTMENT_ID LAST_NAME SALARY POP_STD
------------- ------------------------- ---------- ----------
20 Hartstein 13000 3500
20 Fay 6000 3500
30 Raphaely 11000 3069.6091
30 Khoo 3100 3069.6091
30 Baida 2900 3069.6091
30 Colmenares 2500 3069.6091
30 Himuro 2600 3069.6091
30 Tobias 2800 3069.6091
60 Hunold 9000 1722.32401
60 Ernst 6000 1722.32401
60 Austin 4800 1722.32401
60 Pataballa 4800 1722.32401
60 Lorentz 4200 1722.32401
STDDEV_SAMP
úۻƫ룬ƽ䷵ֵVAR_POPƽͬStandard DeviationSample
SAMPLEز203060нˮֵƫ
SELECT department_id, last_name, hire_date, salary,
STDDEV_SAMP(salary) OVER
(PARTITION BY department_id ORDER BY hire_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_sdev
FROM employees
WHERE department_id in (20,30,60);
DEPARTMENT_ID LAST_NAME HIRE_DATE SALARY CUM_SDEV
------------- ------------------------- ---------- ---------- ----------
20 Hartstein 17-2 -96 13000
20 Fay 17-8 -97 6000 4949.74747
30 Raphaely 07-12-94 11000
30 Khoo 18-5 -95 3100 5586.14357
30 Tobias 24-7 -97 2800 4650.0896
30 Baida 24-12-97 2900 4035.26125
30 Himuro 15-11-98 2600 3649.2465
30 Colmenares 10-8 -99 2500 3362.58829
60 Hunold 03-1 -90 9000
60 Ernst 21-5 -91 6000 2121.32034
60 Austin 25-6 -97 4800 2163.33077
60 Pataballa 05-2 -98 4800 1982.42276
60 Lorentz 07-2 -99 4200 1925.61678
SUM
úбʽۻ͡
SAMPLEͬһԱнˮۻֵ
SELECT manager_id, last_name, salary,
SUM (salary) OVER (PARTITION BY manager_id ORDER BY salary
RANGE UNBOUNDED PRECEDING) l_csum
FROM employees
WHERE manager_id in (101,103,108);
MANAGER_ID LAST_NAME SALARY L_CSUM
---------- ------------------------- ---------- ----------
101 Whalen 4400 4400
101 Mavris 6500 10900
101 Baer 10000 20900
101 Greenberg 12000 44900
101 Higgins 12000 44900
103 Lorentz 4200 4200
103 Austin 4800 13800
103 Pataballa 4800 13800
103 Ernst 6000 19800
108 Popp 6900 6900
108 Sciarra 7700 14600
108 Urman 7800 22400
108 Chen 8200 30600
108 Faviet 9000 39600
VAR_POP
Variance PopulationúطǿռϵnullVAR_POP¼㣺
(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)
SAMPLE1998ÿ۵ۻSHûУ
SELECT t.calendar_month_desc,
VAR_POP(SUM(s.amount_sold))
OVER (ORDER BY t.calendar_month_desc) "Var_Pop",
VAR_SAMP(SUM(s.amount_sold))
OVER (ORDER BY t.calendar_month_desc) "Var_Samp"
FROM sales s, times t
WHERE s.time_id = t.time_id AND t.calendar_year = 1998
GROUP BY t.calendar_month_desc;
CALENDAR Var_Pop Var_Samp
-------- ---------- ----------
1998-01 0
1998-02 6.1321E+11 1.2264E+12
1998-03 4.7058E+11 7.0587E+11
1998-04 4.6929E+11 6.2572E+11
1998-05 1.5524E+12 1.9405E+12
1998-06 2.3711E+12 2.8453E+12
1998-07 3.7464E+12 4.3708E+12
1998-08 3.7852E+12 4.3260E+12
1998-09 3.5753E+12 4.0222E+12
1998-10 3.4343E+12 3.8159E+12
1998-11 3.4245E+12 3.7669E+12
1998-12 4.8937E+12 5.3386E+12
VAR_SAMP
Variance SampleúطǿռϵnullVAR_POP¼㣺
(SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1)
SAMPLE1998ÿ۵ۻ
SELECT t.calendar_month_desc,
VAR_POP(SUM(s.amount_sold))
OVER (ORDER BY t.calendar_month_desc) "Var_Pop",
VAR_SAMP(SUM(s.amount_sold))
OVER (ORDER BY t.calendar_month_desc) "Var_Samp"
FROM sales s, times t
WHERE s.time_id = t.time_id AND t.calendar_year = 1998
GROUP BY t.calendar_month_desc;
CALENDAR Var_Pop Var_Samp
-------- ---------- ----------
1998-01 0
1998-02 6.1321E+11 1.2264E+12
1998-03 4.7058E+11 7.0587E+11
1998-04 4.6929E+11 6.2572E+11
1998-05 1.5524E+12 1.9405E+12
1998-06 2.3711E+12 2.8453E+12
1998-07 3.7464E+12 4.3708E+12
1998-08 3.7852E+12 4.3260E+12
1998-09 3.5753E+12 4.0222E+12
1998-10 3.4343E+12 3.8159E+12
1998-11 3.4245E+12 3.7669E+12
1998-12 4.8937E+12 5.3386E+12
VARIANCE
úرʽıOracleñ£
ʽΪ10
ʽ1VAR_SAMP
SAMPLEز30Ӷнˮֵۻ仯
SELECT last_name, salary, VARIANCE(salary)
OVER (ORDER BY hire_date) "Variance"
FROM employees
WHERE department_id = 30;
LAST_NAME SALARY Variance
------------------------- ---------- ----------
Raphaely 11000 0
Khoo 3100 31205000
Tobias 2800 21623333.3
Baida 2900 16283333.3
Himuro 2600 13317000
Colmenares 2500 11307000
=====================================
⣺
select name,sum(cnt) over(order by rownum) from t1
δָȱʡHRûӡ
ĵ⣺
ָ˷ݴڴСݴڴСܻеı仯仯£
overorder by salary salaryۼƣorder byǸĬϵĿ
overpartition by deptnoղŷ
overorder by salary range between 50 preceding and 150 following
ÿжӦݴ֮ǰзֵ50֮зֵ150
overorder by salary rows between 50 preceding and 150 following
ÿжӦݴ֮ǰ50У֮150
overorder by salary rows between unbounded preceding and unbounded following
ÿжӦݴǴӵһеһУЧ
overorder by salary range between unbounded preceding and unbounded following
Ҫοϣexpert one-on-one Tom Kyte Oracle9i SQL Reference6
AVG
ڼһݴڱʽƽֵ
SAMPLEc_mavgԱÿԱƽнˮ棬ƽֵɵǰԱ֮ͬǰһͺһߵƽ
SELECT manager_id, last_name, hire_date, salary,
AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg
FROM employees;
MANAGER_ID LAST_NAME HIRE_DATE SALARY C_MAVG
---------- ------------------------- --------- ---------- ----------
100 Kochhar 21-SEP-89 17000 17000
100 De Haan 13-JAN-93 17000 15000
100 Raphaely 07-DEC-94 11000 11966.6667
100 Kaufling 01-MAY-95 7900 10633.3333
100 Hartstein 17-FEB-96 13000 9633.33333
100 Weiss 18-JUL-96 8000 11666.6667
100 Russell 01-OCT-96 14000 11833.3333
CORR
һԱʽϵµд
COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2))
ͳϽDZ֮ǿȣ֮Ĺζij̶ֳ
һֵֵԤ⡣ͨһ-1~1֮һ,
ϵ˹ǿȣ0ʾء
SAMPLE1998µλ۵ĹϵۻϵSHûУ
SELECT t.calendar_month_number,
CORR (SUM(s.amount_sold), SUM(s.quantity_sold))
OVER (ORDER BY t.calendar_month_number) as CUM_CORR
FROM sales s, times t
WHERE s.time_id = t.time_id AND calendar_year = 1998
GROUP BY t.calendar_month_number
ORDER BY t.calendar_month_number;
CALENDAR_MONTH_NUMBER CUM_CORR
--------------------- ----------
1
2 1
3 .994309382
4 .852040875
5 .846652204
6 .871250628
7 .910029803
8 .917556399
9 .920154356
10 .86720251
11 .844864765
12 .903542662
COVAR_POP
һԱʽЭ
SAMPLECUM_COVPضۺСƷ۸ۻЭ
SELECT product_id, supplier_id,
COVAR_POP(list_price, min_price)
OVER (ORDER BY product_id, supplier_id) AS CUM_COVP,
COVAR_SAMP(list_price, min_price)
OVER (ORDER BY product_id, supplier_id) AS CUM_COVS
FROM product_information p
WHERE category_id = 29
ORDER BY product_id, supplier_id;
PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS
---------- ----------- ---------- ----------
1774 103088 0
1775 103087 1473.25 2946.5
1794 103096 1702.77778 2554.16667
1825 103093 1926.25 2568.33333
2004 103086 1591.4 1989.25
2005 103086 1512.5 1815
2416 103088 1475.97959 1721.97619
.
.
COVAR_SAMP
һԱʽЭ
SAMPLECUM_COVSضۺСƷ۸ۻЭ
SELECT product_id, supplier_id,
COVAR_POP(list_price, min_price)
OVER (ORDER BY product_id, supplier_id) AS CUM_COVP,
COVAR_SAMP(list_price, min_price)
OVER (ORDER BY product_id, supplier_id) AS CUM_COVS
FROM product_information p
WHERE category_id = 29
ORDER BY product_id, supplier_id;
PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS
---------- ----------- ---------- ----------
1774 103088 0
1775 103087 1473.25 2946.5
1794 103096 1702.77778 2554.16667
1825 103093 1926.25 2568.33333
2004 103086 1591.4 1989.25
2005 103086 1512.5 1815
2416 103088 1475.97959 1721.97619
.
.
COUNT
һڷۻָ*һЩǿճcountмָһʽcountرʽǿոֵļֵͬʱЩȵֵᱻ뱻ֵʹDISTINCT¼ȥһȫͬݺֵ
SAMPLEмÿԱڰнˮеǰинˮ[n-50,n+150]֮nʾǰенˮ
磬Philtankerнˮ2200֮ǰнˮڵ2200-501У֮нˮСڵ2200150ûУcountֵcnt3Ϊ2ԼǰУcnt2ֵ൱СڵڵǰеSALARYֵ
SELECT last_name, salary, COUNT(*) OVER () AS cnt1,
COUNT(*) OVER (ORDER BY salary) AS cnt2,
COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING
AND 150 FOLLOWING) AS cnt3 FROM employees;
LAST_NAME SALARY CNT1 CNT2 CNT3
------------------------- ---------- ---------- ---------- ----------
Olson 2100 107 1 3
Markle 2200 107 3 2
Philtanker 2200 107 3 2
Landry 2400 107 5 8
Gee 2400 107 5 8
Colmenares 2500 107 11 10
Patel 2500 107 11 10
.
.
CUME_DIST
һеλãCUME_DISTǷش0Сڻ1ʾNеλá磬һ3еУصۼƷֲֵΪ1/32/33/3
SAMPLEмÿֵԱнˮۻֵķֲٷֱ
SELECT job_id, last_name, salary, CUME_DIST()
OVER (PARTITION BY job_id ORDER BY salary) AS cume_dist
FROM employees WHERE job_id LIKE 'PU%';
JOB_ID LAST_NAME SALARY CUME_DIST
---------- ------------------------- ---------- ----------
PU_CLERK Colmenares 2500 .2
PU_CLERK Himuro 2600 .4
PU_CLERK Tobias 2800 .6
PU_CLERK Baida 2900 .8
PU_CLERK Khoo 3100 1
PU_MAN Raphaely 11000 1
DENSE_RANK
ORDER BYӾбʽֵӲѯصÿһУеλáڵݰORDER BYӾȻÿһиһţӶγһУд1ʼۼӡÿORDER BYʽֵ仯ʱҲ֮ӡֵͬеõͬţΪnullʱȵģܼзصʱûм
SAMPLEмÿԱŷٰнˮγֵкţעRANK
SELECT d.department_id , e.last_name, e.salary, DENSE_RANK()
OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND d.department_id IN ('60', '90');
DEPARTMENT_ID LAST_NAME SALARY DRANK
------------- ------------------------- ---------- ----------
60 Lorentz 4200 1
60 Austin 4800 2
60 Pataballa 4800 2
60 Ernst 6000 3
60 Hunold 9000 4
90 Kochhar 17000 1
90 De Haan 17000 1
90 King 24000 2
FIRST
DENSE_RANKصļȡǰһֵУܶУΪֵȣҪڿʼһϺԴȡ¼
SAMPLEDENSE_RANKŷٰӶcommission_pctFIRSTȡӶ͵ĶӦУȻǰMAXȡнˮ͵ֵLASTȡӶߵĶӦУȻǰMINȡнˮߵֵ
SELECT last_name, department_id, salary,
MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)
OVER (PARTITION BY department_id) "Worst",
MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)
OVER (PARTITION BY department_id) "Best"
FROM employees
WHERE department_id in (20,80)
ORDER BY department_id, salary;
LAST_NAME DEPARTMENT_ID SALARY Worst Best
------------------------- ------------- ---------- ---------- ----------
Fay 20 6000 6000 13000
Hartstein 20 13000 6000 13000
Kumar 80 6100 6100 14000
Banda 80 6200 6100 14000
Johnson 80 6200 6100 14000
Ande 80 6400 6100 14000
Lee 80 6800 6100 14000
Tuvault 80 7000 6100 14000
Sewall 80 7000 6100 14000
Marvins 80 7200 6100 14000
Bates 80 7300 6100 14000
.
.
.
FIRST_VALUE
ݴڵĵһֵ
SAMPLEӼ㰴ŷнˮݴڵĵһֵӦ֣нˮĵһֵжӶӦȡȱʡĵһ
SELECT department_id, last_name, salary, FIRST_VALUE(last_name)
OVER (PARTITION BY department_id ORDER BY salary ASC ) AS lowest_sal
FROM employees
WHERE department_id in(20,30);
DEPARTMENT_ID LAST_NAME SALARY LOWEST_SAL
------------- ------------------------- ---------- --------------
20 Fay 6000 Fay
20 Hartstein 13000 Fay
30 Colmenares 2500 Colmenares
30 Himuro 2600 Colmenares
30 Tobias 2800 Colmenares
30 Baida 2900 Colmenares
30 Khoo 3100 Colmenares
30 Raphaely 11000 Colmenares
LAG
Էʽежýӡȥα꣬ͺαһһڸпɲοǰ֮ǰУͿԴ뵱ǰһѡǰСOffsetһĬֵΪ1ڵķΧͷĬֵĬϷصеһУ෴ĺLEAD
SAMPLEprev_salذhire_dateǰ1еsalaryֵ
SELECT last_name, hire_date, salary,
LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_sal
FROM employees
WHERE job_id = 'PU_CLERK';
LAST_NAME HIRE_DATE SALARY PREV_SAL
------------------------- ---------- ---------- ----------
Khoo 18-5 -95 3100 0
Tobias 24-7 -97 2800 3100
Baida 24-12-97 2900 2800
Himuro 15-11-98 2600 2900
Colmenares 10-8 -99 2500 2600
LAST
DENSE_RANKصļȡһֵУܶУΪֵȣҪڿʼһϺԴȡ¼
SAMPLEDENSE_RANKŷٰӶcommission_pctFIRSTȡӶ͵ĶӦУȻǰMAXȡнˮ͵ֵLASTȡӶߵĶӦУȻǰMINȡнˮߵֵ
SELECT last_name, department_id, salary,
MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)
OVER (PARTITION BY department_id) "Worst",
MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)
OVER (PARTITION BY department_id) "Best"
FROM employees
WHERE department_id in (20,80)
ORDER BY department_id, salary;
LAST_NAME DEPARTMENT_ID SALARY Worst Best
------------------------- ------------- ---------- ---------- ----------
Fay 20 6000 6000 13000
Hartstein 20 13000 6000 13000
Kumar 80 6100 6100 14000
Banda 80 6200 6100 14000
Johnson 80 6200 6100 14000
Ande 80 6400 6100 14000
Lee 80 6800 6100 14000
Tuvault 80 7000 6100 14000
Sewall 80 7000 6100 14000
Marvins 80 7200 6100 14000
Bates 80 7300 6100 14000
.
LAST_VALUE
ݴڵһֵ
SAMPLEӼ㰴ŷнˮݴڵһֵӦ֣нˮһֵжӶӦȡȱʡһ
SELECT department_id, last_name, salary, LAST_VALUE(last_name)
OVER(PARTITION BY department_id ORDER BY salary) AS highest_sal
FROM employees
WHERE department_id in(20,30);
DEPARTMENT_ID LAST_NAME SALARY HIGHEST_SAL
------------- ------------------------- ---------- ------------
20 Fay 6000 Fay
20 Hartstein 13000 Hartstein
30 Colmenares 2500 Colmenares
30 Himuro 2600 Himuro
30 Tobias 2800 Tobias
30 Baida 2900 Baida
30 Khoo 3100 Khoo
30 Raphaely 11000 Raphaely
LEAD
LEADLAG෴LEADԷеǰ֮СOffsetһĬֵΪ1ڵķΧͷĬֵĬϷصеһУ
SAMPLEÿе"NextHired"ذhire_dateһеhire_dateֵ
SELECT last_name, hire_date,
LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS "NextHired"
FROM employees WHERE department_id = 30;
LAST_NAME HIRE_DATE NextHired
------------------------- --------- ---------
Raphaely 07-DEC-94 18-MAY-95
Khoo 18-MAY-95 24-JUL-97
Tobias 24-JUL-97 24-DEC-97
Baida 24-DEC-97 15-NOV-98
Himuro 15-NOV-98 10-AUG-99
Colmenares 10-AUG-99
MAX
һеݴвұʽֵ
SAMPLEdept_maxصǰڲŵнˮֵ
SELECT department_id, last_name, salary,
MAX(salary) OVER (PARTITION BY department_id) AS dept_max
FROM employees WHERE department_id in (10,20,30);
DEPARTMENT_ID LAST_NAME SALARY DEPT_MAX
------------- ------------------------- ---------- ----------
10 Whalen 4400 4400
20 Hartstein 13000 13000
20 Fay 6000 13000
30 Raphaely 11000 11000
30 Khoo 3100 11000
30 Baida 2900 11000
30 Tobias 2800 11000
30 Himuro 2600 11000
30 Colmenares 2500 11000
MIN
һеݴвұʽСֵ
SAMPLEdept_minصǰڲŵСнˮֵ
SELECT department_id, last_name, salary,
MIN(salary) OVER (PARTITION BY department_id) AS dept_min
FROM employees WHERE department_id in (10,20,30);
DEPARTMENT_ID LAST_NAME SALARY DEPT_MIN
------------- ------------------------- ---------- ----------
10 Whalen 4400 4400
20 Hartstein 13000 6000
20 Fay 6000 6000
30 Raphaely 11000 2500
30 Khoo 3100 2500
30 Baida 2900 2500
30 Tobias 2800 2500
30 Himuro 2600 2500
30 Colmenares 2500 2500
NTILE
һΪ"ʽ"ɢбʾ磬ʽ=4еÿһзһ1420Уǰ5з15з2ȵȡĻɱʽֵƽֿЩнзʱоûκpercentilepercentileһУ͵percentileЩӵжеpercentile磬ʽ=4=21percentile=15Уpercentile=25еȵȡ
SAMPLEа6ݷΪ4
SELECT last_name, salary,
NTILE(4) OVER (ORDER BY salary DESC) AS quartile FROM employees
WHERE department_id = 100;
LAST_NAME SALARY QUARTILE
------------------------- ---------- ----------
Greenberg 12000 1
Faviet 9000 1
Chen 8200 2
Urman 7800 2
Sciarra 7700 3
Popp 6900 4
PERCENT_RANK
CUME_DISTۻ䣩ƣһи˵ڼеʱȼ1Ȼn-1nΪеúǷ011֮
SAMPLEKhoosalaryΪ2900prֵΪ0.6ΪRANKڵֵķֵһ
SELECT department_id, last_name, salary,
PERCENT_RANK()
OVER (PARTITION BY department_id ORDER BY salary) AS pr
FROM employees
WHERE department_id < 50
ORDER BY department_id,salary;
DEPARTMENT_ID LAST_NAME SALARY PR
------------- ------------------------- ---------- ----------
10 Whalen 4400 0
20 Fay 6000 0
20 Hartstein 13000 1
30 Colmenares 2500 0
30 Himuro 2600 0.2
30 Tobias 2800 0.4
30 Baida 2900 0.6
30 Khoo 3100 0.8
30 Raphaely 11000 1
40 Mavris 6500 0
PERCENTILE_CONT
һķֲٷֱֵӦֲֵٷֱȵļ㷽PERCENT_RANKûöӦֵͨ㷨õֵ
RN = 1+ (P*(N-1)) PķֲٷֱֵNڵ
CRN = CEIL(RN) FRN = FLOOR(RN)
if (CRN = FRN = RN) then
(value of expression from row at RN)
else
(CRN - RN) * (value of expression for row at FRN) +
(RN - FRN) * (value of expression for row at CRN)
ע⣺PERCENTILE_DISCҲӦķֲֵʱصֵļ㷽ͬ
SAMPLEУڲ60Percentile_Contֵ£
P=0.7 N=5 RN =1+ (P*(N-1)=1+(0.7*(5-1))=3.8 CRN = CEIL(3.8)=4
FRN = FLOOR(3.8)=3
4 - 3.8* 4800 + (3.8 - 3) * 6000 = 5760
SELECT last_name, salary, department_id,
PERCENTILE_CONT(0.7) WITHIN GROUP (ORDER BY salary)
OVER (PARTITION BY department_id) "Percentile_Cont",
PERCENT_RANK()
OVER (PARTITION BY department_id ORDER BY salary) "Percent_Rank"
FROM employees WHERE department_id IN (30, 60);
LAST_NAME SALARY DEPARTMENT_ID Percentile_Cont Percent_Rank
------------------------- ---------- ------------- --------------- ------------
Colmenares 2500 30 3000 0
Himuro 2600 30 3000 0.2
Tobias 2800 30 3000 0.4
Baida 2900 30 3000 0.6
Khoo 3100 30 3000 0.8
Raphaely 11000 30 3000 1
Lorentz 4200 60 5760 0
Austin 4800 60 5760 0.25
Pataballa 4800 60 5760 0.25
Ernst 6000 60 5760 0.75
Hunold 9000 60 5760 1
PERCENTILE_DISC
һķֲٷֱֵӦֲֵٷֱȵļ㷽CUME_DISTûöӦֵȡڸ÷ֲֵһֵ
ע⣺PERCENTILE_CONTҲӦķֲֵʱصֵļ㷽ͬ
SAMPLE0.7ķֲֵڲ30ûжӦCume_DistֵԾȡһֲֵ0.83333333ӦSALARY
SELECT last_name, salary, department_id,
PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY salary )
OVER (PARTITION BY department_id) "Percentile_Disc",
CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary) "Cume_Dist"
FROM employees
WHERE department_id in (30, 60);
LAST_NAME SALARY DEPARTMENT_ID Percentile_Disc Cume_Dist
------------------------- ---------- ------------- --------------- ----------
Colmenares 2500 30 3100 .166666667
Himuro 2600 30 3100 .333333333
Tobias 2800 30 3100 .5
Baida 2900 30 3100 .666666667
Khoo 3100 30 3100 .833333333
Raphaely 11000 30 3100 1
Lorentz 4200 60 6000 .2
Austin 4800 60 6000 .6
Pataballa 4800 60 6000 .6
Ernst 6000 60 6000 .8
Hunold 9000 60 6000 1
SQLʵ1-nȫ
with tmp as (select level l from dual connect by level<=4)
select sys_connect_by_path(l,',')
from tmp
where level=4
connect by nocycle l<>prior l;
úʵNĽ׳
SELECT MAX(prod)
FROM (SELECT prod
FROM ( SELECT ROWNUM rn
FROM DUAL
CONNECT BY ROWNUM<=6
)
MODEL RETURN UPDATED ROWS
DIMENSION BY (rn)
MEASURES (rn rn2,1 prod )
RULES (
prod[any] order by rn=DECODE(rn2[cv()],1,1,prod[cv()-1]*rn2[cv()])
)
)
--1鿴ռѾʹõİٷֱ
select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/1024 "used MB",b.bytes/1024/1024 "free MB",round(((a.bytes-b.bytes)/a.bytes)*100,2) "percent_used"
from
(select tablespace_name,sum(bytes) bytes from dba_data_files group by tablespace_name) a,
(select tablespace_name,sum(bytes) bytes,max(bytes) largest from dba_free_space group by tablespace_name) b
where a.tablespace_name=b.tablespace_name
order by ((a.bytes-b.bytes)/a.bytes) desc
Sum MBʾռеļܹڲϵͳռô̿ռĴС
磺testռ2ļdatafile1Ϊ300MBdatafile2Ϊ400MBôtestռġSum MB700MB
userd MBʾռѾʹ˶
free MBʾռʣ
percent_userʾѾʹõİٷֱ
--21в鿴MLOG_NORM_SPACEռʹðٷֱȴﵽ90%Բ鿴ñռܹмļÿļǷԶչԶչֵ
select file_name,tablespace_name,bytes/1024/1024 "bytes MB",maxbytes/1024/1024 "maxbytes MB" from dba_data_files
where tablespace_name='MLOG_NORM_SPACE';
--3MLOG_NORM_SPACEռĿǰĴСΪ19GBÿļֻΪ20GBļҪдӱռļ
òϵͳUNIXLinuxеdf -g(鿴¿ʹõĴ̿ռС)
ȡռ䣺
select dbms_metadata.get_ddl('TABLESPACE','MLOG_NORM_SPACE') from dual;
--4ȷϴ̿ռ㹻һļalter tablespace MLOG_NORM_SPACE
add datafile '/oracle/oms/oradata/mlog/Mlog_Norm_data001.dbf'
size 10M autoextend on maxsize 20G
--5֤Ѿӵļ
select file_name,file_id,tablespace_name from dba_data_files
where tablespace_name='MLOG_NORM_SPACE'
--6ɾռļ£
alter tablespace MLOG_NORM_SPACE
drop datafile '/oracle/oms/oradata/mlog/Mlog_Norm_data001.dbf'