学习oracle技术,每天学一点,每天进步一点

Oracle 9i 分析函数参考手册(一)

上一篇 / 下一篇  2008-06-16 17:05:52 / 个人分类:pl/sql

Oracle 9i 分析函数参考手册

Oracle从8.1.6开始提供分析函数分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。ITPUB个人空间,r+E.vu0~K9t[`.\
下面例子中使用的表来自Oracle自带的HR用户下的表,如果没有安装该用户,可以在SYS用户下运行$ORACLE_HOME/demo/schema/human_resources/hr_main.sql来创建。ITPUB个人空间LX/Rc5}d1ZZ]
        少数几个例子需要访问SH用户下的表,如果没有安装该用户,可以在SYS用户下运行$ORACLE_HOME/demo/schema/sales_history/sh_main.sql来创建。ITPUB个人空间J"YQ%N*my.ghC0u
        如果未指明缺省是在HR用户下运行例子。
~`*E tA,IVk0        开窗函数的的理解:
n})BVV$KZ0        开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
d+}\,f#bsR9c0over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数
y'@ o5HW*o0over(partition by deptno)按照部门分区
y5[{8f8o_f0over(order by salary range between 50 preceding and 150 following)ITPUB个人空间,AU1F:k4\yN.Yd
每行对应的数据窗口是之前行幅度值不超过50,之后行幅度值不超过150ITPUB个人空间)\1xWvd0F&o)tM&e
over(order by salary rows between 50 preceding and 150 following)
jY^/t7G-v zQ C fU0每行对应的数据窗口是之前50行,之后150行ITPUB个人空间zWT'hnM _
over(order by salary rows between unbounded preceding and unbounded following)
.nC9hL$WT!o(cB0每行对应的数据窗口是从第一行到最后一行,等效:ITPUB个人空间a&[9s6?Jk3RZ
over(order by salary range between unbounded preceding and unbounded following)ITPUB个人空间 vW JivD I\-`(?
ITPUB个人空间#C8S#Z2Ps-c&idiF
主要参考资料:《expert one-on-one》 Tom Kyte  《Oracle9i SQL Reference》第6章ITPUB个人空间9I+UG9}|'?N

jeYO0a-K,WP0
3iRa6o2JX4Ck0AVGITPUB个人空间je Yap1q]9[2?d9q
功能描述:用于计算一个组和数据窗口内表达式的平均值。
0dl_3y&P*y_"_0SAMPLE:下面的例子中列c_mavg计算员工表中每个员工的平均薪水报告,该平均值由当前员工和与之具有相同经理的前一个和后一个三者的平均数得来;
#U1t+mPkVKOG_0ITPUB个人空间-Lt t{i\&GCk
SELECT manager_id, last_name, hire_date, salary,
(O,R"K{)m)Ph Y8[0   AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date
!mWU"K E%G1L0   ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavgITPUB个人空间B1az{J$y
   FROM employees;ITPUB个人空间?~H/` r"s(Do/_
ITPUB个人空间 @y|Nwy
MANAGER_ID LAST_NAME                 HIRE_DATE     SALARY     C_MAVG
QlF3qd%I%Ph0---------- ------------------------- --------- ---------- ----------ITPUB个人空间Ast)CQ&C;e
       100 Kochhar                   21-SEP-89      17000      17000
XG'T(@ y0       100 De Haan                   13-JAN-93      17000      15000ITPUB个人空间 ]w1Q r4C-B6K
       100 Raphaely                  07-DEC-94      11000 11966.6667ITPUB个人空间yy#K)cG2m F
       100 Kaufling                  01-MAY-95       7900 10633.3333
0[#oLMa_0       100 Hartstein                 17-FEB-96      13000 9633.33333
9P3j f&@&ko0       100 Weiss                     18-JUL-96       8000 11666.6667
4X2YAQ.aC)M \5~0       100 Russell                   01-OCT-96      14000 11833.3333
&d e#SO@$Z5m0.
fDa&Z LkLO(OE0.
Bm \&Zo.u)B0.
[qc.T-s0ITPUB个人空间!{}4z'd1C;`1O1vle

1k~att BP'` Z0CORR
&nA4_]a2q^0功能描述:返回一对表达式的相关系数,它是如下的缩写:ITPUB个人空间O&qhWE8d wkB
          COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2))
q1ho-q"p Xh!T0          从统计上讲,相关性是变量之间关联的强度,变量之间的关联意味着在某种程度ITPUB个人空间8B,|x(~$]:p7Zm6U(?8{
          上一个变量的值可由其它的值进行预测。通过返回一个-1~1之间的一个数, 相关
KB"Q9_M*VZ0          系数给出了关联的强度,0表示不相关。
9Dt6q!z]0SAMPLE:下例返回1998年月销售收入和月单位销售的关系的累积系数(本例在SH用户下运行)
z Faw"^ C |5g H0ITPUB个人空间Nj:H?8RF
SELECT t.calendar_month_number,ITPUB个人空间u~ n,IDV0G_c
       CORR (SUM(s.amount_sold), SUM(s.quantity_sold))ITPUB个人空间9F.}"A/a2dvg
       OVER (ORDER BY t.calendar_month_number) as CUM_CORRITPUB个人空间 V1|r4F,E~mE(HYc5e.Pp
  FROM sales s, times tITPUB个人空间baL;qikL?'XT
WHERE s.time_id = t.time_id AND calendar_year = 1998ITPUB个人空间 R-z;[3vg s],R7j
GROUP BY t.calendar_month_number
w!lBb^Q$V0ORDER BY t.calendar_month_number;ITPUB个人空间uz({%sQ!@B
ITPUB个人空间a/_G Tc&iVj ] v
CALENDAR_MONTH_NUMBER   CUM_CORRITPUB个人空间4}L~X~R
--------------------- ----------
}pUIUM1Ki+D,`#B l0                    1ITPUB个人空间eF5pB;H A)@~
                    2          1ITPUB个人空间"z$E6OQ*}h
                    3 .994309382ITPUB个人空间;m$T%T.D:J.`D3\4VzI&[
                    4 .852040875
/q$J C0j,i0                    5 .846652204
(It!A/K:mO~V0                    6 .871250628
-@6H#AN(iP u-k0                    7 .910029803ITPUB个人空间ig!?4[-Q7~e9q
                    8 .917556399ITPUB个人空间!RDp(E\a#dq
                    9 .920154356
^_r$a"St:F7N0                   10  .86720251
KM8m?nf:\v0                   11 .844864765
-^'Vr h*Xf)l0                   12 .903542662ITPUB个人空间2n![{!`#@b3W2} I
ITPUB个人空间8i2uA4uo5rale8W
ITPUB个人空间 ?`v D F Xz
COVAR_POP  
zY`$kTG0功能描述:返回一对表达式的总体协方差。ITPUB个人空间IPHl0DXsw1H
SAMPLE:下例CUM_COVP返回定价和最小产品价格的累积总体协方差ITPUB个人空间}2UE0Vi6B])i&YSad

*BKZ`BF {1[0SELECT product_id, supplier_id,
9o}(R2Xkp aV0        COVAR_POP(list_price, min_price)ITPUB个人空间6Y1^"h r t'v:gfda
          OVER (ORDER BY product_id, supplier_id) AS CUM_COVP,
\z&eKm0        COVAR_SAMP(list_price, min_price)
6~$M,^#WJ9t:H0          OVER (ORDER BY product_id, supplier_id) AS CUM_COVS
MPe!Ky&X#X5O m0  FROM product_information pITPUB个人空间0SMM?q QE Z.G
WHERE category_id = 29
7Q\,L z+v }0ORDER BY product_id, supplier_id;ITPUB个人空间^h g"u ]'fV aR3z

X.d6?W4FE xE0PRODUCT_ID SUPPLIER_ID   CUM_COVP   CUM_COVS
&fh\wC'MN Hv0---------- ----------- ---------- ----------
kY Z6b7R"R)_+Y0      1774      103088          0ITPUB个人空间|[.A(^NZ$x7j+a
      1775      103087    1473.25     2946.5ITPUB个人空间~O]2^\/S7g;|
      1794      103096 1702.77778 2554.16667ITPUB个人空间M {"E'X r.?z8_:Df
      1825      103093    1926.25 2568.33333ITPUB个人空间ziN;E8cjro
      2004      103086     1591.4    1989.25
f4t3t B)N |)m'~9`0      2005      103086     1512.5       1815
T*B$jm0y R0      2416      103088 1475.97959 1721.97619ITPUB个人空间bG sYZr3D"q
.ITPUB个人空间b*J)\ m.R/g
.ITPUB个人空间)Uknb"CO/_
ITPUB个人空间 K:Xl"FvBY
ITPUB个人空间T1w4S V-b:y!L oR
COVAR_SAMP  ITPUB个人空间 a{0Q @_#x&vZj uA
功能描述:返回一对表达式的样本协方差ITPUB个人空间#JA6N0f3\K
SAMPLE:下例CUM_COVS返回定价和最小产品价格的累积样本协方差
d4F8A!G8R G0
8d2a9I7o8AQs%k0SELECT product_id, supplier_id,ITPUB个人空间MC5B.p S7ZQ9f4B
        COVAR_POP(list_price, min_price)ITPUB个人空间 o&W-v l,nS w
          OVER (ORDER BY product_id, supplier_id) AS CUM_COVP,ITPUB个人空间0^u(CK P"l
        COVAR_SAMP(list_price, min_price)ITPUB个人空间j(|Ry(ml
          OVER (ORDER BY product_id, supplier_id) AS CUM_COVS
9c3i |8GHA7`t1N0  FROM product_information p
7b"M2L!w-f \[-f0WHERE category_id = 29ITPUB个人空间Ee W&P[L W
ORDER BY product_id, supplier_id;ITPUB个人空间g;b4Cn%Mq{

`6b^t,~x6X0PRODUCT_ID SUPPLIER_ID   CUM_COVP   CUM_COVS
(ug Fx|TH0---------- ----------- ---------- ----------ITPUB个人空间5dA0FK0K-sJ
      1774      103088          0ITPUB个人空间8Mv!J?+G%Q9fUI5R^e
      1775      103087    1473.25     2946.5
z T0t`amX#Z-njW7L0      1794      103096 1702.77778 2554.16667
3z(^I"DZ3^0      1825      103093    1926.25 2568.33333ITPUB个人空间WM/\iE2V ]bp
      2004      103086     1591.4    1989.25
8k5xY~\L_0      2005      103086     1512.5       1815ITPUB个人空间)_-V d!o/M2|
      2416      103088 1475.97959 1721.97619
Q{6v_ s?T0.ITPUB个人空间%_ hx?"Ah(iO5}E
.
W:v!w&Sv+p-p!i0ITPUB个人空间,G:h$o#tyH

*z"B-AS hjm0COUNTITPUB个人空间l i!D+fQ5|+Ep
功能描述:对一组内发生的事情进行累积计数,如果指定*或一些非空常数,count将对所有行计数,如果指定一个表达式,count返回表达式非空赋值的计数,当有相同值出现时,这些相等的值都会被纳入被计算的值;可以使用DISTINCT来记录去掉一组中完全相同的数据后出现的行数。ITPUB个人空间Sw ]LiA
SAMPLE:下面例子中计算每个员工在按薪水排序中当前行附近薪水在[n-50,n+150]之间的行数,n表示当前行的薪水ITPUB个人空间'B*Jq `(H
例如,Philtanker的薪水2200,排在他之前的行中薪水大于等于2200-50的有1行,排在他之后的行中薪水小于等于2200+150的行没有,所以count计数值cnt3为2(包括自己当前行);cnt2值相当于小于等于当前行的SALARY值的所有行数ITPUB个人空间(W:qE A[l
ITPUB个人空间(?U"PW,Ao,w
SELECT last_name, salary, COUNT(*) OVER () AS cnt1,
!Jb0zsE3UaX#TWX0       COUNT(*) OVER (ORDER BY salary) AS cnt2,ITPUB个人空间U4A"]'G/ztXh*g
       COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDINGITPUB个人空间U3S dS7V,}
       AND 150 FOLLOWING) AS cnt3 FROM employees;
d+rr1Y2n*o"p]0ITPUB个人空间f)U)o$]zG@D:S
LAST_NAME                     SALARY       CNT1       CNT2       CNT3
@e&k6^'ea0------------------------- ---------- ---------- ---------- ----------
3n%Nz&L!Q"k\5]0Olson                           2100        107          1          3ITPUB个人空间5i O h| H mq I8m
Markle                          2200        107          3          2ITPUB个人空间+w ^#v#h^;K!y*yM3O%a3N
Philtanker                      2200        107          3          2
h UA.W h0Landry                          2400        107          5          8ITPUB个人空间] gb](O1t
Gee                             2400        107          5          8ITPUB个人空间#f} T @.u
Colmenares                      2500        107         11         10
/bo hx#kB0Patel                           2500        107         11         10ITPUB个人空间 I3ir#aS%Me
.
j0W"|\ N1J0.ITPUB个人空间Z{n@Pc$C\Uh

Ri%c#YC}XJ0
h(zr6{8|zq0CUME_DIST
i5M-W D*[d/y7w+|0功能描述:计算一行在组中的相对位置,CUME_DIST总是返回大于0、小于或等于1的数,该数表示该行在N行中的位置。例如,在一个3行的组中,返回的累计分布值为1/3、2/3、3/3ITPUB个人空间9{.}K:Y;mL
SAMPLE:下例中计算每个工种的员工按薪水排序依次累积出现的分布百分比
"PDjRJ*B0
`rQ5L,X0SELECT job_id, last_name, salary, CUME_DIST()ITPUB个人空间/oZEi\ L_2GB2n
       OVER (PARTITION BY job_id ORDER BY salary) AS cume_distITPUB个人空间6D8K q&g h0n
  FROM employees  WHERE job_id LIKE 'PU%';ITPUB个人空间o7~?Wu%csEQ

7e9D&hu `:N:oy0JOB_ID     LAST_NAME                     SALARY  CUME_DIST
+A iw ].[_%\;S0---------- ------------------------- ---------- ----------
WX'M'w2k|h0PU_CLERK   Colmenares                      2500         .2
`0^,QB3u3@P0PU_CLERK   Himuro                          2600         .4ITPUB个人空间w1| {&h.?e5k%N
PU_CLERK   Tobias                          2800         .6
mcr1c"m}+?*N!hgW0PU_CLERK   Baida                           2900         .8
Rni9P;o4H0PU_CLERK   Khoo                            3100          1ITPUB个人空间(tI,xVJp5V5M+R:PS'T S
PU_MAN     Raphaely                       11000          1
l+cIy2e+[_ n0ITPUB个人空间-F vWt*m([

9QT3tM;F.Jp)W+}h0DENSE_RANKITPUB个人空间7{KsH)R|
功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。密集的序列返回的时没有间隔的数
5Tg?*w4Py0SAMPLE:下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与RANK函数的区别)
t/iBMP0
)ru,woXJ0SELECT d.department_id , e.last_name, e.salary, DENSE_RANK()ITPUB个人空间X8}.r,wf4mW$R
        OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank
.Sz r,d+rX.b"UiQV*Z0  FROM employees e, departments d
Xm+VTl2A Yk*C\ s:H0WHERE e.department_id = d.department_idITPUB个人空间'X? k?nm~
   AND d.department_id IN ('60', '90');
f'r,lJ]c$^7I0
@n.kbF!]#g0DEPARTMENT_ID LAST_NAME                     SALARY      DRANK
^@ wS.y#e I,T&Hx0------------- ------------------------- ---------- ----------
z;G2ZYO O1Nk4_0           60 Lorentz                         4200          1ITPUB个人空间&RD dhet:W
           60 Austin                          4800          2
MPD0ZH@OdH0           60 Pataballa                       4800          2ITPUB个人空间k9} c:u*S(o;Vbk8Nl
           60 Ernst                           6000          3ITPUB个人空间TJ\.|0zoB+J
           60 Hunold                          9000          4ITPUB个人空间gRB.r G oP'U:h o8t bP"c
           90 Kochhar                        17000          1ITPUB个人空间!s:{ R1lF8@ Cw2s
           90 De Haan                        17000          1ITPUB个人空间] k"~}1g&}"G+Rf
           90 King                           24000          2ITPUB个人空间b?` r [R"P

5J.Uw;mf.Vl&B y9p0ITPUB个人空间voLVFc Q
FIRST
/{#?1\(Q!J5[ F1Y9]0功能描述:从DENSE_RANK返回的集合中取出排在最前面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录ITPUB个人空间!k2mp Y0[
SAMPLE:下面例子中DENSE_RANK按部门分区,再按佣金commission_pct排序,FIRST取出佣金最低的对应的所有行,然后前面的MAX函数从这个集合中取出薪水最低的值;LAST取出佣金最高的对应的所有行,然后前面的MIN函数从这个集合中取出薪水最高的值
#J S7d8[ G cY0SELECT last_name, department_id, salary,ITPUB个人空间.u8U]'c"B.C7X1T
         MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)ITPUB个人空间e5V'g Eq)un"og.u
         OVER (PARTITION BY department_id) "Worst",ITPUB个人空间j-rHi7Wk?7T
         MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)
Y*Ua`i7`5Q J/I$f0         OVER (PARTITION BY department_id) "Best"
B*D6UatD8^rQ0  FROM employees
3uj"b| _ K/Q7zF0WHERE department_id in (20,80)
.Fl2IsT'pP)Z7K0ORDER BY department_id, salary;
;@Rjc8e9ACi0ITPUB个人空间R)V QY4J
LAST_NAME                 DEPARTMENT_ID     SALARY      Worst       BestITPUB个人空间"MV8](z*B7Ws*zCz
------------------------- ------------- ---------- ---------- ----------
$U V0\WmkK;~)]0Fay                                  20       6000       6000      13000ITPUB个人空间-X&\'E.G_7X G/@
Hartstein                            20      13000       6000      13000
'BdJ*S1bS1H*jz0Kumar                                80       6100       6100      14000
#x \bj6sk6ib{:vK0Banda                                80       6200       6100      14000ITPUB个人空间5Y7Y LRv
Johnson                              80       6200       6100      14000ITPUB个人空间 LB2k C6e7y7Z8t:m
Ande                                 80       6400       6100      14000
T Rc`Y S1OIH0Lee                                  80       6800       6100      14000ITPUB个人空间O,|%df!T
Tuvault                              80       7000       6100      14000
)d.xq!\N'K%a R0Sewall                               80       7000       6100      14000
1B9s6X0q\@0Marvins                              80       7200       6100      14000
"?(e&]C'Q2_0Bates                                80       7300       6100      14000ITPUB个人空间.| b*?"b(Y(W&J"H
.ITPUB个人空间+O6Vo1MR&A/DBNm
.
F6lJ^*YUS%j0.ITPUB个人空间M,e+B#bV-q

+s:zf}c7C0
1YM1p)az V*k0FIRST_VALUE  
`3g5p4zw4t9z0功能描述:返回组中数据窗口的第一个值。ITPUB个人空间6~/v;@k1o*hJ0Z;lb \
SAMPLE:下面例子计算按部门分区按薪水排序的数据窗口的第一个值对应的名字,如果薪水的第一个值有多个,则从多个对应的名字中取缺省排序的第一个名字
5rgYG1JH*bJl0
~,UOv+Qz0SELECT department_id, last_name, salary, FIRST_VALUE(last_name)ITPUB个人空间5|5zu-h.?9vp0L
  OVER (PARTITION BY department_id ORDER BY salary ASC ) AS lowest_salITPUB个人空间+I/n.Y])|!P4y
  FROM employees
_ F/P%r&fF\.G4|3Y*D0WHERE department_id in(20,30);
DYA?]+a0
v G0_l'`mM!w2W;X0DEPARTMENT_ID LAST_NAME                     SALARY LOWEST_SAL
ky;Q@dS*r&o0------------- ------------------------- ---------- --------------ITPUB个人空间-e+so;Gl"s F{
           20 Fay                             6000 Fay
*U&T$ea^v$v0           20 Hartstein                      13000 Fay
1kd'tl9Eao0           30 Colmenares                      2500 ColmenaresITPUB个人空间]s0K)d"TEh,i:w
           30 Himuro                          2600 ColmenaresITPUB个人空间5j,N1KDi.U.j[a
           30 Tobias                          2800 Colmenares
NuVw!X;?$URi0|0           30 Baida                           2900 Colmenares
XKrhGbj_^k lb0           30 Khoo                            3100 Colmenares
*I ?,L9?'@'uL wk#x0           30 Raphaely                       11000 ColmenaresITPUB个人空间*\8qqd6?L`0r7G
ITPUB个人空间.T,E/jba^r\

%}\V-Q*h9x/JV5f3Y0LAGITPUB个人空间"EVc7gS"~V*Ws
功能描述:可以访问结果集中的其它行而不用进行自连接。它允许去处理游标,就好像游标是一个数组一样。在给定组中可参考当前行之前的行,这样就可以从组中与当前行一起选择以前的行。Offset是一个正整数,其默认值为1,若索引超出窗口的范围,就返回默认值(默认返回的是组中第一行),其相反的函数是LEADITPUB个人空间+wb2u/A ? K6Ya+Q
SAMPLE:下面的例子中列prev_sal返回按hire_date排序的前1行的salary值ITPUB个人空间(` R4R&nh.Ai2_ n

?%E Y A6g HA/Lc0SELECT last_name, hire_date, salary,
f,FM ~j6_0       LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_salITPUB个人空间4rM(G-}/D tm z
  FROM employees
:G1W p4JNV |0WHERE job_id = 'PU_CLERK';ITPUB个人空间 Epu _,Yv R&Zh d
ITPUB个人空间W[.MJ)t;f+[ O
LAST_NAME                 HIRE_DATE      SALARY   PREV_SAL
] |z'D(M6[l(||0------------------------- ---------- ---------- ----------
1q%L6O!OP'luMW0Khoo                      18-5月 -95       3100          0
*L ^#P7Z1tx[[-S!s0Tobias                    24-7月 -97       2800       3100ITPUB个人空间k}#]D4WW&j] t:x
Baida                     24-12月-97       2900       2800ITPUB个人空间3k\Oa!EZ2y
Himuro                    15-11月-98       2600       2900ITPUB个人空间Qeh"Jn;OC9Ur
Colmenares                10-8月 -99       2500       2600ITPUB个人空间!o?A9J9A"QrGot

dkr)v%T;C!V,x@0
&|2?ru fB0LAST
}+D vF-Gz&t0功能描述:从DENSE_RANK返回的集合中取出排在最后面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录ITPUB个人空间B.a4M0c,~JX
SAMPLE:下面例子中DENSE_RANK按部门分区,再按佣金commission_pct排序,FIRST取出佣金最低的对应的所有行,然后前面的MAX函数从这个集合中取出薪水最低的值;LAST取出佣金最高的对应的所有行,然后前面的MIN函数从这个集合中取出薪水最高的值ITPUB个人空间|!U] HxQmI
SELECT last_name, department_id, salary,ITPUB个人空间#PDh B7_tCw%`
         MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)
#m~:S4OX0         OVER (PARTITION BY department_id) "Worst",ITPUB个人空间5]Flq"KK/a%?
         MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)ITPUB个人空间_8f.W%K|/gHn
         OVER (PARTITION BY department_id) "Best"
iz"F f`E pjVs0  FROM employeesITPUB个人空间f"Z/`A/b/f(@
WHERE department_id in (20,80)
L,{0o4U V5a8M0ORDER BY department_id, salary;
7z(K!`o8m0
}B0l E3zY1@@,^0LAST_NAME                 DEPARTMENT_ID     SALARY      Worst       BestITPUB个人空间+gwho7t7M#B1G#yMg
------------------------- ------------- ---------- ---------- ----------ITPUB个人空间N3g{&Y,K*?!Q
Fay                                  20       6000       6000      13000ITPUB个人空间5s/~f5E+p7xi
Hartstein                            20      13000       6000      13000ITPUB个人空间s6jq;u/R w9~
Kumar                                80       6100       6100      14000
X&T o4s}0Banda                                80       6200       6100      14000ITPUB个人空间 ^R]2b,Fj%P
Johnson                              80       6200       6100      14000
&F ?ZF%@;S5bI0Ande                                 80       6400       6100      14000ITPUB个人空间 Ts#^r/DH#Ne I
Lee                                  80       6800       6100      14000ITPUB个人空间R9T](zVm3@
Tuvault                              80       7000       6100      14000ITPUB个人空间 p!K4UW1d*f4^O
Sewall                               80       7000       6100      14000
5w2lP&L%C7sUB@0Marvins                              80       7200       6100      14000ITPUB个人空间+ju+ew+m-P"Y [%d5t
Bates                                80       7300       6100      14000ITPUB个人空间'O"h;?'t,E!B4r
.ITPUB个人空间+Wq6f:C j{C:b
.
-u"a.vX|"~0.ITPUB个人空间?L I Fr9zT

&?2mvP[T7U}|0ITPUB个人空间/Oz Q#^ZQ"K`(h+m(K
LAST_VALUEITPUB个人空间u!JG%OUEl'G&E#B
功能描述:返回组中数据窗口的最后一个值。ITPUB个人空间I ~)cX0o8]
SAMPLE:下面例子计算按部门分区按薪水排序的数据窗口的最后一个值对应的名字,如果薪水的最后一个值有多个,则从多个对应的名字中取缺省排序的最后一个名字ITPUB个人空间I%_1Cl*J
SELECT department_id, last_name, salary, LAST_VALUE(last_name)
M&c\!{W[?e0    OVER(PARTITION BY department_id ORDER BY salary) AS highest_salITPUB个人空间 u ?A~ x{g&h|
  FROM employeesITPUB个人空间#KkR%}~;JN4p
WHERE department_id in(20,30);
(XUC1u5R!D"g/uS0ITPUB个人空间 I;gn TY/O Y
DEPARTMENT_ID LAST_NAME                     SALARY HIGHEST_SAL
2vMU4Cc0------------- ------------------------- ---------- ------------ITPUB个人空间9V)Z.K]oL9Q
           20 Fay                             6000 FayITPUB个人空间:t/kR?+w5x&]|
           20 Hartstein                      13000 HartsteinITPUB个人空间X-~ N6g!_ aAv
           30 Colmenares                      2500 ColmenaresITPUB个人空间*hsp/Q I N;Pd8n&Q;P9]
           30 Himuro                          2600 HimuroITPUB个人空间r f6c2E-h/J
           30 Tobias                          2800 TobiasITPUB个人空间MTt,{.vz
           30 Baida                           2900 BaidaITPUB个人空间9b qyG-M
           30 Khoo                            3100 Khoo
9RY&m%O!j5z1q0           30 Raphaely                       11000 Raphaely
[6O)U&{`R0ITPUB个人空间`$F;Qo^$HT

&K LWD-H;@3| J0LEAD
!}|!r pX#a0功能描述:LEAD与LAG相反,LEAD可以访问组中当前行之后的行。Offset是一个正整数,其默认值为1,若索引超出窗口的范围,就返回默认值(默认返回的是组中第一行)ITPUB个人空间?_o\0AG
SAMPLE:下面的例子中每行的"NextHired"返回按hire_date排序的下一行的hire_date值ITPUB个人空间;P.k??A/qs s Yr|gS

9XJO\K0SELECT last_name, hire_date,ITPUB个人空间 I1C\%J|1s$O1n
        LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS "NextHired"ITPUB个人空间K:r [O/?
  FROM employees WHERE department_id = 30;
NW,nha]'dhp2x0
+_#l|/\ pJ(yj0LAST_NAME                 HIRE_DATE NextHired
I8C~2f h A/hsanA0------------------------- --------- ---------ITPUB个人空间5f5J7I/ix ~K
Raphaely                  07-DEC-94 18-MAY-95ITPUB个人空间j u8e,kuq,Z
Khoo                      18-MAY-95 24-JUL-97
J9xE{5w([0Tobias                    24-JUL-97 24-DEC-97ITPUB个人空间vx:s.OF
Baida                     24-DEC-97 15-NOV-98
/i+a-D(\#f,U,@0Himuro                    15-NOV-98 10-AUG-99
g2N6S5{(]Ib0Colmenares                10-AUG-99ITPUB个人空间c5Y:Oe&Yg&j"Q3r+aS
ITPUB个人空间Fa5x.IAsb ?

c'zG@ w{*g!H]0MAX
IA7Pc-C3\0z*X0功能描述:在一个组中的数据窗口中查找表达式的最大值。ITPUB个人空间 JPm![jjk
SAMPLE:下面例子中dept_max返回当前行所在部门的最大薪水值ITPUB个人空间 _OOZf"[Kq,H[/X

w V"C&g N3F0SELECT department_id, last_name, salary,
,W*^K\&c/k0z0   MAX(salary) OVER (PARTITION BY department_id) AS dept_maxITPUB个人空间%~ w)~)A S ~*H!|+}
   FROM employees WHERE department_id in (10,20,30);
6RWg^;n4o d k1h0ITPUB个人空间4sqJ%h8h'H-|&K
DEPARTMENT_ID LAST_NAME                     SALARY   DEPT_MAX
0ky#y:Oa@#Ol0n0------------- ------------------------- ---------- ----------ITPUB个人空间)t|W f g.v
           10 Whalen                          4400       4400ITPUB个人空间)u] {FbGBMh
           20 Hartstein                      13000      13000ITPUB个人空间BcwS;ut1gP~
           20 Fay                             6000      13000
g5OH4L!B C0           30 Raphaely                       11000      11000
&i([@{[L!e_$x0           30 Khoo                            3100      11000
n_HM j0           30 Baida                           2900      11000ITPUB个人空间!@j.@"_i`2[
           30 Tobias                          2800      11000
V0S P+^j x^ f]0           30 Himuro                          2600      11000ITPUB个人空间0k'YjL1XZtz@2Q
           30 Colmenares                      2500      11000
4b q1e%xUj$~0
;\/[|]8vMvI0ITPUB个人空间 e%QeU&?4m%G
MINITPUB个人空间F w{;J2kC}t xUm
功能描述:在一个组中的数据窗口中查找表达式的最小值。ITPUB个人空间D~UqF/~,~q
SAMPLE:下面例子中dept_min返回当前行所在部门的最小薪水值ITPUB个人空间0]iy-nBzXb,f1L
ITPUB个人空间I-^$u#bs2Xa/u
SELECT department_id, last_name, salary,
j{Bg8^'BK0   MIN(salary) OVER (PARTITION BY department_id) AS dept_minITPUB个人空间 wbW R/_!~Uq
   FROM employees WHERE department_id in (10,20,30);ITPUB个人空间e XpFu?z l
ITPUB个人空间Gwn^z6s9N8p
DEPARTMENT_ID LAST_NAME                     SALARY   DEPT_MINITPUB个人空间(K(V6NlvgsN!P
------------- ------------------------- ---------- ----------
HKF"ns H_e0           10 Whalen                          4400       4400ITPUB个人空间V"^v"[ m+d,Du
           20 Hartstein                      13000       6000ITPUB个人空间t,Je$Fy4ko O
           20 Fay                             6000       6000ITPUB个人空间3~d_1Bb~,vJ
           30 Raphaely                       11000       2500
QoEf;hz4|0           30 Khoo                            3100       2500ITPUB个人空间5[.A&J#?y7L
           30 Baida                           2900       2500
5o$Pc;T%CA0           30 Tobias                          2800       2500ITPUB个人空间s{7gm h2F
           30 Himuro                          2600       2500
p'[.e2@D q3i5DwC(J2R0           30 Colmenares                      2500       2500
ML:~0V;z0p r0
^cx@:@#@ c0ITPUB个人空间 BFNW9r#h;Q)x
NTILE
W6Q PX5PW_,V]M k0功能描述:将一个组分为"表达式"的散列表示,例如,如果表达式=4,则给组中的每一行分配一个数(从1到4),如果组中有20行,则给前5行分配1,给下5行分配2等等。如果组的基数不能由表达式值平均分开,则对这些行进行分配时,组中就没有任何percentile的行数比其它percentile的行数超过一行,最低的percentile是那些拥有额外行的percentile。例如,若表达式=4,行数=21,则percentile=1的有5行,percentile=2的有5行等等。ITPUB个人空间!SA%wBCu]/~o-\
SAMPLE:下例中把6行数据分为4份
0_5yZ}@ u w0
CL0t/EBS0SELECT last_name, salary,
A&M6` g+~9|0       NTILE(4) OVER (ORDER BY salary DESC) AS quartile FROM employees
PBin5F0WHERE department_id = 100;ITPUB个人空间8`&a&d~ Qw

OJ w2z+id&S0LAST_NAME                     SALARY   QUARTILE
K2Xm _Vo C0------------------------- ---------- ----------
)EK-w M ^E4_0Greenberg                      12000          1ITPUB个人空间+t2~#niL Hx
Faviet                          9000          1
-T0FU'M%^qM-Z0Chen                            8200          2ITPUB个人空间bUs"G3Z8Gma/z
Urman                           7800          2
u!@n7e s3`tJ:Y`8b0Sciarra                         7700          3ITPUB个人空间ge|IYK;D7i
Popp                            6900          4
\%l*sjR4}0
9\u7{(Chg0ITPUB个人空间1VZ7U"ZcDD
PERCENT_RANKITPUB个人空间+T7gZ1Nkam%|M1y
功能描述:和CUME_DIST(累积分配)函数类似,对于一个组中给定的行来说,在计算那行的序号时,先减1,然后除以n-1(n为组中所有的行数)。该函数总是返回0~1(包括1)之间的数。
?(J{ T5Z%Cr^ }0SAMPLE:下例中如果Khoo的salary为2900,则pr值为0.6,因为RANK函数对于等值的返回序列值是一样的
)i2t!F5f+x F.a$u0
H^)G&~4H[0SELECT department_id, last_name, salary,ITPUB个人空间`].i^n'R6hc&d*yn&z$@Q
       PERCENT_RANK()
6M ix4p Q2O0       OVER (PARTITION BY department_id ORDER BY salary) AS prITPUB个人空间$A'A"j6y4Z4?F*p
  FROM employeesITPUB个人空间:T,R%OWjnTP8v
WHERE department_id < 50ITPUB个人空间km5XDz4x5U4I}%Ae
  ORDER BY department_id,salary;
P2a/^#a3SA!m+xz0
e'r%].He$t$gh0DEPARTMENT_ID LAST_NAME                     SALARY         PR
;C;k:vx@)|*e/@0------------- ------------------------- ---------- ----------ITPUB个人空间&PDOdIW
           10 Whalen                          4400          0
9|]vm6q0R?0           20 Fay                             6000          0
Q6}0R/d8mi0           20 Hartstein                      13000          1
h(r d*C+T.Og0           30 Colmenares                      2500          0
|k7R.Woe&` bZG0           30 Himuro                          2600        0.2ITPUB个人空间)zd XfcG]p
           30 Tobias                          2800        0.4ITPUB个人空间 L1f"y-D#Hw(u2rV
           30 Baida                           2900        0.6
7Q'D d l{ t0           30 Khoo                            3100        0.8ITPUB个人空间wu.GS m:q3o0],k+e+Y
           30 Raphaely                       11000          1ITPUB个人空间&X*zyLs!^*x
           40 Mavris                          6500          0ITPUB个人空间Me'U4\w7k\

)L&W/];ey'v0
ifo Q0_tF0PERCENTILE_CONT
7V|R0d4HW"dY0功能描述:返回一个与输入的分布百分比值相对应的数据值,分布百分比的计算方法见函数PERCENT_RANK,如果没有正好对应的数据值,就通过下面算法来得到值:
B7l,d0n^0        RN = 1+ (P*(N-1)) 其中P是输入的分布百分比值,N是组内的行数
`9l,b/D`"a S/A0        CRN = CEIL(RN)  FRN = FLOOR(RN)ITPUB个人空间%G!~p0rpL2N}D
if (CRN = FRN = RN) then
HH(iCja.D?2j9|?0                (value of expression from row at RN)ITPUB个人空间Pz O9M^p+ql
        else
3p c1^|:E w0                (CRN - RN) * (value of expression for row at FRN) +
#G"~bTB/^.dN6w8?4d0                (RN - FRN) * (value of expression for row at CRN)ITPUB个人空间QY}H:Sm
          注意:本函数与PERCENTILE_DISC的区别在找不到对应的分布值时返回的替代值的计算方法不同
;c:@(c M9M0ITPUB个人空间{nRlQbp
SAMPLE:在下例中,对于部门60的Percentile_Cont值计算如下:ITPUB个人空间9FC$KeN w H{n|F^
        P=0.7  N=5 RN =1+ (P*(N-1)=1+(0.7*(5-1))=3.8 CRN = CEIL(3.8)=4  
3c8G t4MA6eN0FRN = FLOOR(3.8)=3
XT+M0_K%j\0          (4 - 3.8)* 4800 + (3.8 - 3) * 6000 = 5760
zqvfQR!|.y0
` V6lB6c4Aa _0SELECT last_name, salary, department_id,
2@G${)}$vmIh2D+Z0       PERCENTILE_CONT(0.7) WITHIN GROUP (ORDER BY salary)ITPUB个人空间.?W7st D(t%s6G+fh
       OVER (PARTITION BY department_id) "ercentile_Cont",ITPUB个人空间%^k0n$k-nT7u#D"G
       PERCENT_RANK()ITPUB个人空间O8X4_)sA
       OVER (PARTITION BY department_id ORDER BY salary) "ercent_Rank"ITPUB个人空间nTl!j#u)dS2V
  FROM employees WHERE department_id IN (30, 60);ITPUB个人空间YX#P)IER1V.U8A

l0[]%c Bl&w,u0LAST_NAME                     SALARY DEPARTMENT_ID Percentile_Cont Percent_RankITPUB个人空间D }z,I%e7U~K#h
------------------------- ---------- ------------- --------------- ------------
x)JH:jK~(Q/[ l,{0Colmenares                      2500            30            3000            0
c `8Hk&S?0Himuro                          2600            30            3000          0.2
6Av7GLis8M0Tobias                          2800            30            3000          0.4ITPUB个人空间"A[%w$zH[XR*|R
Baida                           2900            30            3000          0.6
^l!lus}k)_;M+l(}aj0Khoo                            3100            30            3000          0.8
z'lJ{I A+D0Raphaely                       11000            30            3000            1ITPUB个人空间6w{Nb;GJ L
Lorentz                         4200            60            5760            0
[*cv#NC;r\c t0Austin                          4800            60            5760         0.25
|5To-A-m0Pataballa                       4800            60            5760         0.25
+Lt,a)}{ a C#^0Ernst                           6000            60            5760         0.75ITPUB个人空间/PbPt(^3C7h5f
Hunold                          9000            60            5760            1
|H6w/x2|LE0
tKkwwdm'WT%T0P0ITPUB个人空间-_.O7Kd A
PERCENTILE_DISC
4hGO"m,P E7G0功能描述:返回一个与输入的分布百分比值相对应的数据值,分布百分比的计算方法见函数CUME_DIST,如果没有正好对应的数据值,就取大于该分布值的下一个值。ITPUB个人空间^b:Hf;k%C
注意:本函数与PERCENTILE_CONT的区别在找不到对应的分布值时返回的替代值的计算方法不同
8prX%T5z `2v6k0ITPUB个人空间2T4_bnbXR
SAMPLE:下例中0.7的分布值在部门30中没有对应的Cume_Dist值,所以就取下一个分布值0.83333333所对应的SALARY来替代ITPUB个人空间+h ^OHV
ITPUB个人空间3J6uZ\ pq
SELECT last_name, salary, department_id,
4`M"V/h3N+cb,L0       PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY salary )
-L5\w1gU1XW0       OVER (PARTITION BY department_id) "ercentile_Disc",ITPUB个人空间:I y*J R%j?tz%s
       CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary)      "Cume_Dist"
$b8w(Q P#wet$|0  FROM employees
8O)|;O{7r*[)D1G0WHERE department_id in (30, 60);
2J%pAU1Q'@0
(R{ \)c-@0LAST_NAME                     SALARY DEPARTMENT_ID Percentile_Disc  Cume_Dist
G revO5o"C;o,M Hg [!s0------------------------- ---------- ------------- --------------- ----------ITPUB个人空间y |r0y7@P {}
Colmenares                      2500            30            3100 .166666667
5O&@kst%K+u0Himuro                          2600            30            3100 .333333333
T0~@'g'X n2@]q0Tobias                          2800            30            3100         .5ITPUB个人空间*M1_S.s%P1{0t+PB
Baida                           2900            30            3100 .666666667ITPUB个人空间9e)i-?+{9gWhX6C
Khoo                            3100            30            3100 .833333333ITPUB个人空间2Z-U}K$o+PBL
Raphaely                       11000            30            3100          1
tO`Al Z%}&?0Lorentz                         4200            60            6000         .2
7zo R Pg,Gth0Austin                          4800            60            6000         .6ITPUB个人空间%OQyr7K Dc"P5a
Pataballa                       4800            60            6000         .6ITPUB个人空间g4w:}0Z]|
Ernst                           6000            60            6000         .8ITPUB个人空间"M:nP9X*?8S,X H
Hunold                          9000            60            6000          1
\8R*l~1eC7O0^ `Kr0
6py(S@a^4e~0ITPUB个人空间 P"rI"v{
RANKITPUB个人空间9D!H/S-C)}`(cO.RI
功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。然而,如果两行的确得到同样的排序,则序数将随后跳跃。若两行序数为1,则没有序数2,序列将给组中的下一行分配值3,DENSE_RANK则没有任何跳跃。ITPUB个人空间CM _Nx%t)p Qm4l8r
SAMPLE:下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与DENSE_RANK函数的区别)
`f Y6v7X2gT#F)H0
,c3trJ ?p0SELECT d.department_id , e.last_name, e.salary, RANK()ITPUB个人空间n"GR%u [1Rd R6x
        OVER (PARTITION BY e.department_id ORDER BY e.salary) as drankITPUB个人空间4^!\J^Yt3~
  FROM employees e, departments dITPUB个人空间9tD:{&v8^pO*Sb
WHERE e.department_id = d.department_idITPUB个人空间^LG8Fg(l5?C ELq
   AND d.department_id IN ('60', '90');ITPUB个人空间$BN0C*OO1[0_
ITPUB个人空间;P/^VjT/['f;g"@
DEPARTMENT_ID LAST_NAME                     SALARY      DRANKITPUB个人空间l'qo2B!x4e
------------- ------------------------- ---------- ----------
Bc0d/pt*j\o0           60 Lorentz                         4200          1ITPUB个人空间a?V GK jD&\
           60 Austin                          4800          2
!XU@n N'O(B0           60 Pataballa                       4800          2ITPUB个人空间*Fq6tE1DF[3N
           60 Ernst                           6000          4
nk+Xb v!s0           60 Hunold                          9000          5
&I[)e+?]0           90 Kochhar                        17000          1
5|Mt^&K+w*G0           90 De Haan                        17000          1
K6qgzd+i0           90 King                           24000          3
,axV H}F2w0
S5iO M5x0Z0ITPUB个人空间"d6k!Z4HA2s7\
RATIO_TO_REPORT
bH X?$b*\.y#{/H0功能描述:该函数计算expression/(sum(expression))的值,它给出相对于总数的百分比,即当前行对sum(expression)的贡献。
LX Th{m3T)R$z8y0SAMPLE:下例计算每个员工的工资占该类员工总工资的百分比
M,Vr/qn{0ITPUB个人空间[2q2s.| lM
SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rrITPUB个人空间]\'lF N!~&f
  FROM employeesITPUB个人空间,_:ds;F&g9O
WHERE job_id = 'PU_CLERK';ITPUB个人空间,ky Ts'~4T$M%U2d#w

:o:dQG%mN c|0LAST_NAME                     SALARY         RR
.zq(K.J}tN*B0------------------------- ---------- ----------ITPUB个人空间"`q%[rQHT2\ T
Khoo                            3100 .223021583ITPUB个人空间,J i#UX {!Ik _ @
Baida                           2900 .208633094
}/}N la(w_0Tobias                          2800 .201438849
|0lu0qW6[Z#j9klN0Himuro                          2600  .18705036ITPUB个人空间'?/B^%ALzo-S O
Colmenares                      2500 .179856115
Y~@6f f.U0
})`mSU e0ITPUB个人空间 i[6f;Bn%JMC
REGR_ (Linear Regression) Functions
3y'Q"ulX2fV0功能描述:这些线性回归函数适合最小二乘法回归线,有9个不同的回归函数可使用。
I(J?jzg {v0          REGR_SLOPE:返回斜率,等于COVAR_POP(expr1, expr2) / VAR_POP(expr2)
H$DIJ0m3gk0          REGR_INTERCEPT:返回回归线的y截距,等于ITPUB个人空间UZ]h\*yz;@;`9E!W&s
                          AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2)
M^2L S cMqA0          REGR_COUNT:返回用于填充回归线的非空数字对的数目ITPUB个人空间6F8[;AK!X(Nd n;d
          REGR_R2:返回回归线的决定系数,计算式为:
-n!ax{,pK7L8g x G7d0                   If VAR_POP(expr2)  = 0 then return NULLITPUB个人空间BeFfqv/?gBgK
                   If VAR_POP(expr1)  = 0 and VAR_POP(expr2) != 0 then return 1
`x;sB7H5[gY M7J0                   If VAR_POP(expr1)  > 0 and VAR_POP(expr2  != 0 then
\-c"~4^"h$_)B0                      return POWER(CORR(expr1,expr),2)ITPUB个人空间'L!UR-cC9uJ
          REGR_AVGX:计算回归线的自变量(expr2)的平均值,去掉了空对(expr1, expr2)后,等于AVG(expr2)
O%KtI6^1|7eR0          REGR_AVGY:计算回归线的应变量(expr1)的平均值,去掉了空对(expr1, expr2)后,等于AVG(expr1)
UC(^d9YMLU0          REGR_SXX: 返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr2)
5@jp ~1b0          REGR_SYY: 返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr1)ITPUB个人空间y*Lm.g'H7u?(U
          REGR_SXY:  返回值等于REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2)
+j;^j.x@X6yp0
,a\&Jr/h m7wO O0(下面的例子都是在SH用户下完成的)ITPUB个人空间4v;e'zZIji%ZP
SAMPLE 1:下例计算1998年最后三个星期中两种产品(260和270)在周末的销售量中已开发票数量和总数量的累积斜率和回归线的截距ITPUB个人空间 N*C6K!a,N C;E
ITPUB个人空间kJA ] ZQ
SELECT t.fiscal_month_number "Month", t.day_number_in_month "Day",ITPUB个人空间kaNV:Rs O2G/~.r
       REGR_SLOPE(s.amount_sold, s.quantity_sold)ITPUB个人空间SV$Vc ds.z}:d#ki
         OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_SLOPE,
1Cj1}xAT5C0       REGR_INTERCEPT(s.amount_sold, s.quantity_sold)
`^S3?.F&I7_V0         OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_ICPT
)I1[;v M#O+I.Xt0  FROM sales s, times t
1rXs+hX.\'}2E H0WHERE s.time_id = t.time_idITPUB个人空间Y`?4na6b[%A.\k)y
   AND s.prod_id IN (270, 260)
|4Z+YA8@X9|`4MhS0   AND t.fiscal_year=1998ITPUB个人空间e'd+U.nj~
   AND t.fiscal_week_number IN (50, 51, 52)
_:U:],_/v0   AND t.day_number_in_week IN (6,7)
fX9X^ZH^ s+R0   ORDER BY t.fiscal_month_desc, t.day_number_in_month;ITPUB个人空间VR {&vla
ITPUB个人空间bT e+@D [
     Month        Day  CUM_SLOPE   CUM_ICPTITPUB个人空间_ H+m*S)S'Brsl
---------- ---------- ---------- ----------
p#B"o9F1G]0Il0        12         12        -68       1872ITPUB个人空间N K3KS%dYk6Kz
        12         12        -68       1872
[GIc'X G8D7`0        12         13 -20.244898 1254.36735
"] FiE A!LZ(S0        12         13 -20.244898 1254.36735ITPUB个人空间VSAD} E5|
        12         19 -18.826087       1287ITPUB个人空间dQ'}C0TO;]o E
        12         20 62.4561404  125.28655
g E;h+]L0        12         20 62.4561404  125.28655
2O1o^XP5Vv%Vu0        12         20 62.4561404  125.28655ITPUB个人空间;E:SCx Ww#s F
        12         20 62.4561404  125.28655ITPUB个人空间E| yO~)@A[zKV
        12         26 67.2658228 58.9712313ITPUB个人空间0E%w4Ve9BK
        12         26 67.2658228 58.9712313
G#n#B@Hu*D0        12         27 37.5245541 284.958221
g8~i e B2}j0        12         27 37.5245541 284.958221
-z5@;H@,_,]0        12         27 37.5245541 284.958221ITPUB个人空间GOn.W ^0a E
ITPUB个人空间^I4O9Z[ ^c+wX@
SAMPLE 2:下例计算1998年4月每天的累积交易数量
qsG vjb {].N`5q0ITPUB个人空间+wb.vl*`;jG
SELECT UNIQUE t.day_number_in_month,ITPUB个人空间hP.q3e)caA
       REGR_COUNT(s.amount_sold, s.quantity_sold)
^B @{#~X)T5f-p[0        OVER (PARTITION BY t.fiscal_month_number ORDER BY t.day_number_in_month)ITPUB个人空间/c {.pPo8|0YFi
    "Regr_Count"ITPUB个人空间R+idZ Z
FROM sales s, times t
WKUY8d*x!w6O0WHERE s.time_id = t.time_id
)|t(A#b^0S0AND t.fiscal_year = 1998 AND t.fiscal_month_number = 4;ITPUB个人空间mbxx_5q:ox"c.nK

$G3IY2~*m0DAY_NUMBER_IN_MONTH Regr_Count
,zKw2J0b3z0------------------- ----------
;VG)Kw mf0                  1        825ITPUB个人空间:Z|SJ7g#WK
                  2       1650ITPUB个人空间.] L g[T/Z
                  3       2475ITPUB个人空间,u sp tt*BdtM
                  4       3300
\X7zmbvbY5j0.ITPUB个人空间)w!J-h"cI N
.
kj yx"\)@r2zl0.ITPUB个人空间~f$YR9SsSb&u.V
                 26      21450ITPUB个人空间vy:w:O(HH8UqbrU
                 30      22200ITPUB个人空间q#?}#IM3~ \
ITPUB个人空间i.tM nEL9M
SAMPLE 3:下例计算1998年每月销售量中已开发票数量和总数量的累积回归线决定系数ITPUB个人空间\-oC{?}
ITPUB个人空间1Wmg t m)I s)Y8R;a
SELECT t.fiscal_month_number,ITPUB个人空间%voy#m {
       REGR_R2(SUM(s.amount_sold), SUM(s.quantity_sold))
A/J hsUo;q0          OVER (ORDER BY t.fiscal_month_number) "Regr_R2"
!s qit9p5\1|0   FROM sales s, times tITPUB个人空间 v`@3k6q*v2R
   WHERE s.time_id = t.time_idITPUB个人空间 a#}/T]%oCO&WN
   AND t.fiscal_year = 1998ITPUB个人空间 J5E c&SFm3Cpy
   GROUP BY t.fiscal_month_numberITPUB个人空间G2mt tr'MezR:sG@c
   ORDER BY t.fiscal_month_number;ITPUB个人空间v*wwFY:r)s
ITPUB个人空间pWx,TQV l]5q3to
FISCAL_MONTH_NUMBER    Regr_R2ITPUB个人空间4@N F~#Q#h4K
------------------- ----------ITPUB个人空间4qig8rI3_h8e
                  1
8Tw)|4H e)B&c ~h0                  2          1ITPUB个人空间 e oMt6F!qio;\6Gx
                  3 .927372984ITPUB个人空间|Dm rT'Q B
                  4 .807019972ITPUB个人空间]Km.y B'i S7oc
                  5 .932745567ITPUB个人空间#` c*`0j+I[!C
                  6  .94682861
4Bb$YR8r D0                  7 .965342011
&b,w6{9j(mH0                  8 .955768075ITPUB个人空间\QM#x:K:To*ju6j
                  9 .959542618
3M%TVW8oE-|0                 10 .938618575ITPUB个人空间\3bLN&ik2a@ g
                 11 .880931415ITPUB个人空间3\u`/s}0^"V
                 12 .882769189ITPUB个人空间7w-{ W'c"[u/o!K
ITPUB个人空间(L Ag:KSS Guu r,zG l
SAMPLE 4:下例计算1998年12月最后两周产品260的销售量中已开发票数量和总数量的累积平均值
+R @ jF Jiu5N^D0
_$B6{-l7o6t l|`"r0SELECT t.day_number_in_month,
DB Uuiqp F0   REGR_AVGY(s.amount_sold, s.quantity_sold)
#Po8~Rn$|,e V0      OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month)ITPUB个人空间l2Z$t/M/?p;H
      "Regr_AvgY",ITPUB个人空间2r"[g]7]9eq
   REGR_AVGX(s.amount_sold, s.quantity_sold)ITPUB个人空间*t!~ iP9eS
      OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month)
M}7?}*A)jsjz4a0      "Regr_AvgX"
D|\wH3Z0   FROM sales s, times t
e4cp!ac7jR0   WHERE s.time_id = t.time_id
_.BB@(pI0      AND s.prod_id = 260ITPUB个人空间^%zH)aV1^*i,{
      AND t.fiscal_month_desc = '1998-12'ITPUB个人空间yeYH s
      AND t.fiscal_week_number IN (51, 52)ITPUB个人空间\6b$`/]?2iJB
   ORDER BY t.day_number_in_month;
.s?g)rp,UB5t0
(CH/aC?"{t-t0DAY_NUMBER_IN_MONTH  Regr_AvgY  Regr_AvgXITPUB个人空间b+[6L.M-MV5fQ
------------------- ---------- ----------
RR4GD~v;L0                 14        882       24.5
$B N0]-} Ah p W0                 14        882       24.5ITPUB个人空间T @K$w8PN1{7p
                 15        801      22.25
NXj W6X$U,? Q~D&cA0                 15        801      22.25
6q z$o`a"qN1S7[0                 16      777.6       21.6
'biV c h_9z:|{X0                 18 642.857143 17.8571429ITPUB个人空间hy!R o0Qw0Db{hU
                 18 642.857143 17.8571429ITPUB个人空间X` EH/u,M4F Mg
                 20      589.5     16.375
6_&KUYN B5g0                 21        544 15.1111111ITPUB个人空间tR"@ z{d5?+a
                 22 592.363636 16.4545455
B x'sz#q4Q.i0                 22 592.363636 16.4545455
S*`6G z$`~0                 24 553.846154 15.3846154
~ @Vu5N0                 24 553.846154 15.3846154ITPUB个人空间 ^*H"p5h!f4BZS&^1d6f
                 26        522       14.5ITPUB个人空间4YG0V.N6lbrxP@.O
                 27      578.4 16.0666667
?KL0jj6t#[0
Cr|Og!A&T%P7BE0

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-09-07  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 16307
  • 日志数: 277
  • 图片数: 2
  • 建立时间: 2007-12-11
  • 更新时间: 2008-09-03

RSS订阅

Open Toolbar