a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 228|回复: 5

[综合] Oracle辅导:分析函数和开窗函数

[复制链接]
发表于 2012-8-4 13:54:49 | 显示全部楼层 |阅读模式
一:分析函数over   Oracle 从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是
& t+ o( Q" F6 V9 y. x3 l  对于每个组返回多行,而聚合函数对于每个组只返回一行。' E- s4 k5 R: H" P4 f9 C- ^
  下面通过几个例子来说明其应用。
9 W5 w0 M0 i& M' f  1:统计某商店的营业额。
  O: K+ l# L. o& E5 r( o6 y  t  date       sale$ }4 o+ F% \6 j# F
  1           20
* W  b/ ^& F6 e4 |2 Y9 Z  2           15. j3 c9 v9 b! m0 y1 D6 e3 b
  3           14
0 M7 p0 `9 u' m$ G7 v& K  4           183 J9 s4 }$ d. |2 {& `5 D
  5           30) w. ~  s/ W' L
  规则:按天统计:每天都统计前面几天的总额
% T2 n  R& f' s0 d! t  c% U  得到的结果:
/ S5 v6 ~* d; f" u* L* g% \  DATE   SALE       SUM
; }( A: R+ t1 N( N6 k. Q1 g0 Q  ----- -------- ------
- H' c% I, H- v; [! v0 x- R7 \3 W( b  1      20        20           --1天
- g3 e4 N) ?! h; {  2      15        35           --1天+2天
- `& u7 n0 n2 }! _# O  3      14        49           --1天+2天+3天8 N7 c; @; Z' t$ W, j) u& B
  4      18        67            .
1 J! |2 d" @) S$ Y& B' N2 W6 U1 m  5      30        97            ." |1 R" s% Q( g* d5 k& ~
  2:统计各班成绩第一名的同学信息
) j$ a- m8 ~( E  NAME   CLASS S
1 E) v  L% b- G0 _/ P' S  ----- ----- ----------------------
9 ^! R1 m+ g" X: @9 `& w. M  fda    1      80
6 u2 I) J( q. j  ffd    1      78
- ~& V, i' o& }+ U, a& A6 W  dss    1      95
2 a. L5 O4 e3 C( p  cfe    2      74
& e; V6 f, d' V; k* R+ u* Z  gds    2      92
8 q- j( T- m1 o  gf     3      99
4 z  q' E! }3 b4 J. N, Q  ddd    3      99
+ x. B# {4 N7 `7 i4 F0 l  adf    3      45/ o3 F# R1 b1 Z$ I* G$ N8 ?
  asdf   3      55
) H1 [2 ?; y8 v8 C" C: j' K/ ^! N: b& V% i2 W' z: i1 s
  3dd    3      78
回复

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:50 | 显示全部楼层

Oracle辅导:分析函数和开窗函数

</p>  通过:& ?0 |/ {0 J1 W9 n# Z! m
  --) L2 C9 ~( x& |: c- p. S' N
  select * from" ~1 p% ?: e4 i1 X! u
  (6 H7 r0 I# ^; Z: |
  select name,class,s,rank()over (partition by class order by s desc) mm from t2
: l5 {2 o! I% V7 z  )
4 T% C* I" [* Y: S1 l  where mm=1% `+ I% s% s% Z$ V! F' E) X
  --
) x- f9 }$ ^3 _9 f: w' E  得到结果:7 H( i, d$ v* `5 P7 _
  NAME   CLASS S                       MM7 w# a; w5 N$ r; `
  ----- ----- ---------------------- ----------------------( {" Y3 m6 k5 B, }! Y% r0 r
  dss    1      95                      1
& i" F, `/ {1 Z# @) d9 I' g" z( a2 E  gds    2      92                      11 w" C3 D, ]% @2 C
  gf     3      99                      1
% J$ p# h( `3 p  ddd    3      99                      1. w! l! @3 Y3 U% S! k, q6 |
  注意:
* M; k% x% c+ I$ X- t  1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果
  j5 `4 s& x, @4 Z4 {- L0 R' {# U  2.rank()和dense_rank()的区别是:0 w, _8 I- R* X! n7 i) H4 j) v
  --rank()是跳跃排序,有两个第二名时接下来就是第四名! p" t$ n5 R' G2 z9 u8 O7 t/ F! V
  --dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
6 O+ x! }1 k  r- X' u, H3 N8 _  3.分类统计 (并显示信息), t: s" F8 r  x: p" j3 ]& s5 `/ o
  A   B   C- ~: |" @3 `+ L, a
  -- -- ----------------------
( Z2 B$ K# K: o# |, `6 w  m   a   2$ Z0 N* |5 E: H; E0 m1 [! i
  n   a   3) L# x; L! T1 j/ n7 [: p
  m   a   2* Q' r  X0 K8 Z$ m( }, z/ c( }$ I- `
  n   b   2" P/ z. b1 j- A6 ~$ h* @
  n   b   1
) N4 O, o: U6 h% T  x   b   3
% I" p2 Q, F* d8 F; R- ~( @# `3 [  x   b   2& z; m3 d0 W, M; R# O. H; q8 G
  x   b   4
2 p5 P% T9 d  ?. m: ^4 j3 C  G  h   b   34 q& V8 `7 Y; F/ b6 E& ~* n) N
  select a,c,sum(c)over (partition by a) from t2
, F; V, ~- D# _* }' q( J8 ^  得到结果:
' d2 b* O  [$ D; E; J  A   B   C        SUM(C)OVER (PARTITIONBYA)
" |: C* m6 M7 q$ _* ~2 J9 s+ n/ T2 C# h* O4 G1 m" g: I
  -- -- ------- ------------------------
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:51 | 显示全部楼层

Oracle辅导:分析函数和开窗函数

</p>  h   b   3        3) B9 N0 e* x9 l% F; B5 l
  m   a   2        48 R% \: q6 M* l/ J. h
  m   a   2        4
7 C, e2 f& L! N( u. h. M- O  n   a   3        6
7 k& u$ v/ D8 E" h  n   b   2        6
6 N3 x6 V7 `* c8 I  n   b   1        6# I4 G) {" e2 E. ?6 d
  x   b   3        9/ X/ |# q+ Q) X8 I
  x   b   2        9. g) I2 q0 E$ i+ u6 ~- |; o# P
  x   b   4        9
7 I2 N0 x/ G9 L. s- h  如果用sum,group by 则只能得到$ e* T6 ^. s  ]! Y5 T
  A   SUM(C)
0 J5 @( o+ r5 p$ X- r3 O, n) Y  -- ----------------------
- ^; W1 S  t/ B3 x& t8 x2 e  h   3$ Y. S7 @  W+ v9 h4 h' x
  m   4
+ [4 \1 z; X/ A$ g1 g  n   61 I0 p& t/ h! E# n* o
  x   9
- O) k/ t- W4 B) D8 K- P  无法得到B列值4 V7 S* m' p& ]
  =====
+ l5 J1 r) G4 f  select * from test
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:52 | 显示全部楼层

Oracle辅导:分析函数和开窗函数

数据:   A B C9 L% }0 [' `" X7 Q
  1 1 1
% K* [  ]6 T, M& \6 h! m$ w  1 2 2; }, x7 V( b8 E8 \2 P% E+ m* v; D
  1 3 37 U( \5 I5 F* i1 t# {4 q
  2 2 5
9 R8 [+ ?8 }/ n0 e, b7 m1 ?  3 4 6" F3 Q) L( g% U& Q, ?8 c# ]& f: T
  ---将B栏位值相同的对应的C 栏位值加总
" c8 {, z& ~1 I" A" {  select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum9 k1 z9 r6 M+ n
  from test& j2 p9 v; n6 @$ K5 H' R% q' o, s& [
  A B C C_SUM
" ?% i- A9 Y8 O" P  1 1 1 1
/ h# D$ k  a2 R9 y1 L: F  1 2 2 7" R; B5 c$ `7 `5 |9 J
  2 2 5 7; E1 A1 l+ `4 @5 P. Z% S; X
  1 3 3 3
" x) n" U+ |! S9 q4 n0 P  _, c/ `  3 4 6 6
' ?3 _" W2 g1 A! V  ---如果不需要已某个栏位的值分割,那就要用 null; A8 Q& Y1 \5 V2 |$ @$ x
  eg: 就是将C的栏位值summary 放在每行后面
/ A+ m& {2 u* S& V% d! p  select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum
) @- P' \0 q7 S, o% D/ m4 l' Z  from test8 a! v9 @1 L/ _( d
  A B C C_SUM
  P% Y& W! |$ Z0 z  1 1 1 17
- X0 [% ?' ^" ]8 {8 g  w  1 2 2 17
4 J* x: F+ R) `' u9 K, l  1 3 3 174 L  l- u& _! d, E! D/ y
  2 2 5 17
  ]2 T. R. u" E3 t  3 4 6 17
: e% e! [. k+ ]& H: p) ]2 B7 V: ?5 A8 E  求个人工资占部门工资的百分比5 H& k) O: @  @; z' F
  SQL> select * from salary;
) z- U& T& ~8 \# Z" x& R
( K' v. ]& G' ~6 I9 V  NAME DEPT SAL
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:53 | 显示全部楼层

Oracle辅导:分析函数和开窗函数

</p>  ---------- ---- -----$ s/ H( C( H* u$ N, S7 T
  a 10 2000
5 w/ C+ M0 B& Y5 U  B& O  b 10 30008 r, |4 ~* M5 E3 H
  c 10 5000
" H& a9 j7 b8 Y9 ~* D" w. }+ l  d 20 4000
/ x5 a# d5 U2 Z% U! `' }/ s  SQL> select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;
( R4 F! E. r$ d' |0 ~' _5 w  NAME DEPT SAL PERCENT
4 c# \& v0 o4 Q2 p2 i( {3 h; G  ---------- ---- ----- ----------+ ]) ?/ ~& z0 T' |5 O
  a 10 2000 20* [9 q/ z# @+ A, `& Z% w1 e0 _
  b 10 3000 30* g6 _. g$ t4 h4 i) ?; ?$ y
  c 10 5000 50- G" U1 S, s- Y2 C3 T: t% Q) a8 ?
  d 20 4000 1003 Q! e* O0 }# M
  二:开窗函数
8 _# p6 D2 V1 x1 a( ^- }1 Y  开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
% b! `( \0 T& P. ^% B  1:
7 S2 |1 j/ T: W4 \+ U: I  g! C7 O4 l  over (order by salary) 按照salary排序进行累计,order by是个默认的开窗函数
1 d' y& Z) v8 l  M6 |  over (partition by deptno)按照部门分区1 v: M. q% q) A9 T
  2:
1 F# q' q' |1 S' ?. M; `  over (order by salary range between 5 preceding and 5 following)3 c( R% _8 P5 a' g  {
  每行对应的数据窗口是之前行幅度值不超过5,之后行幅度值不超过5  u" Z' v5 l8 `6 ~5 b
  例如:对于以下列
: ?4 I$ W# U7 Y  aa
1 y" X  O: u. ?! _  1" q# |) ]% {9 d, E  j0 T9 f$ q
  2
% u7 N5 g$ X% D+ u* K" Y  2' o/ L' D8 b0 ]( T  N& F
  2+ E7 Z! g0 j+ h5 g3 R2 D
  3
  i! r3 H& R! @) S  c  Y  4% v' Z9 q0 W+ t3 G! _) s/ Q/ s
  5
' E# j6 r5 U; W9 h  6( B& h* T6 x- W, J! h
  7
7 ?& R9 u6 @7 K& G# {- O( {; ~# o7 G# f0 a3 h* V8 s
  9
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:54 | 显示全部楼层

Oracle辅导:分析函数和开窗函数

</p>  sum(aa)over (order by aa range between 2 preceding and 2 following)
" @* ]0 k9 e& I$ j# z' R  得出的结果是+ b, S% S* X& ]& G
  AA                       SUM) R0 E1 r% e. n6 G" ?# V6 H7 F
  ---------------------- -------------------------------------------------------
0 k0 J* o6 P9 U" a  1                       10
5 ?! L5 W0 g& D1 S9 D6 t8 y3 L  2                       14
1 m% |8 Y+ P1 t5 L  2                       14
: X: ]: Q) B3 W$ i! _' v  2                       14
" \/ O, S1 b  W1 F5 Y- D  3                       18! i7 ?2 E- z! E9 z
  4                       18- N$ m  O3 }) o6 l: Z" ^, T$ R
  5                       22
& [0 \2 l& ^  R: o. P. \2 Y  6                       18  V3 T3 y& D; p4 k4 p2 k
  7                       22
1 E) f* R8 U: _9 d  9                       9
1 r4 c9 r4 m  `, b5 B4 A' t- l" e! i) o
  就是说,对于aa=5的一行 ,sum为   5-1
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-15 16:20 , Processed in 0.246555 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表