-
一﹑
Oracle
ROLLUP
和
CUBE
用法
Oracle
的
GROUP BY
p>
语句除了最基本的语法外
,
还支持
ROLLUP
和
CUBE
语句
。
如果是
ROLLUP(A,
B, C)
的话
,
首先会对
(A
、
B
、
C)
进行
GROUP BY
,
然后对
(A
、
B)
进行
GROUP BY
,然后是
(A)
进行
GROUP
BY
,最后对全表进行
GROUP BY
操作
。
如果是
GROUP BY
CUBE(A, B, C)
,
则首先会对
(A
、
B
、
C)
进行
GROUP BY
,
然后依次是
(A
、
B
)
,
(A
、
C
)
,
(A)
,
(B
、
C)
,
(B)
,
(C)
,最后对全表进行
p>
GROUP
BY
操作。
grouping_id()
可以美化效果:
Oracle
的
GROUP BY
p>
语句除了最基本的语法外,还支持
ROLLUP
和
CUBE
语句。
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
下面来看看
ROLLUP
和
CUBE
语句的执行结果。
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
行。
这个查询结果就直观多了,和不带
R
OLLUP
语句的
GROUP
BY<
/p>
相比,
ROLLUP
增加了对
INDEX_TYPE
的
GROUP
BY
统计和对所有记录的
GROUP
BY
统计。
也就是说,如果是
ROLLUP(A, B, C)
的话,首先会对
(A
、
B
、
C)
进行
G
ROUP BY
,然后对
(A
、
B)
进行
GROUP BY
< br>,然后是
(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
行。
和
R
OLLUP
相比,
CUBE
又增加了对
STATUS
列的
GROUP
BY
统计。
如果是
GROUP BY CUBE(A, B, C)
,则首先会对
(A
、
B
、
C)
进行
GROUP BY
,然后依次是
(A
、
B)
,
(A
、
C)
,
(A)
,
(B
、
C)
,
(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_i
d()
可以美化效果:
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.
报表合计专用的
Rol
lup
函数
销售报表
广州
1
月
2000
元
广州
2
月
2500
元
广州
4500
元
深圳
1
月
1000
元
深圳
2
月
2000
元
深圳
3000
元
所有地区
7500
元
以往的查询
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,m
onth)
而不是
RollUp(area,month)
p>
,除了获得每个地区的合计之外,还
将获得每个月份的合计,在报表
最后显示。
ng
让合计列更好读
RollUp
在显示广州合计时,月份列为
NULL<
/p>
,但更好的做法应该是显示为
所有月份<
/p>
Grouping
就是用来判断当前
Column
是否是一个合计列,
1
为
yes
,然后用
Decode
把它转为
所有月份
Select D
ecode(Grouping(area),1,'
所有地区
',area) area, Decode(Grouping(month),1,'
所有月份
',month), sum(money) From
SaleOrder Group by RollUp(area,month);
2.
对多级层次查询的
start
with.....connect by
比如人员组织
p>
,
产品类别
,Oracle
提供了很经典的方法
SELECT LEVEL,
name, emp_id,manager_emp_id FROM employee START
W
ITH
manager_emp_id is null
CONNECT BY PRIOR emp
_id =
manager_emp_id;
上面的语句
demo
了全部的应用
,start with
指明从哪里开始遍历树
,
如果从根开始
,
那么它的
manager
< br>应该是
Null,
如果从某个职员开始
< br>,
可以写成
emp_id='11'
CONNECT BY
就是指明父子关系
,
注意
PRIOR
位置
p>
另外还有一个
LEVEL
列
,
显示节点的层次
3.
更多报表
/
分析决策功能
3.1
分析功能的基本结构
分析功能
() over(
partion
子句
,order by
子句
,
窗口子句
)
< br>
概念上很难讲清楚
,
还是用例
子说话比较好
.
3.2 Row_Number
和
Rank, DENSE_Rank
用于选出
Top 3
sales
这样的报表
当两个业务员
可能有相同业绩时
,
就要使用
Rank
和
Dense_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
保险
.
至于
Desnse
还是
Ranking
就看具体情况了。
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%
当作另一个
L
evel
平等对待
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<
/p>
份
.
3.4
辅助分析列和
Windows
Function
报表除了基本事实数据外
< br>,
总希望旁边多些全年总销量
,
到目前为止的累计销量
,
前后三个月的平
均销量这样的列来参考
.
这种前后
三个月的平均和到目前为止的累计销量就叫
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
当前纪录
ry
总结
S
ubQuery
天天用了
,
理论上总结
一下
.SubQuery
分三种
related
子查询
最普通的样式
.
ated Subqueries
把父查询的列拉到子查询里
面去
,
头一回
cyt
< br>教我的时候理解了半天
.
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)
=======================================
=
/*--------
理解
gro
uping 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
)
*/
二﹑
开窗函数的的理解:
开窗函数指定了
分析函数工作的数据窗口大小,
这个数据窗口大小可能会随着行的变化而变化,
举例如下:
over
(
order by
salary
)
按照
salary
排序进行累计,
order
by
是个默认的开窗函数
over
(
partition by
deptno
)按照部门分区
over
(
order by
salary range between 50 preceding and 150
following
)
每行对应的数
据窗口是之前行幅度值不超过
50
,之后行幅度值不超过
150
over
(
order by
salary rows between 50 preceding and 150
following
)
每行对应的数
据窗口是之前
50
行,之后
150
p>
行
over
(
order by
salary rows between unbounded preceding and
unbounded following
)
每行对应的数据窗口是从第一行到最后一行,等效:
over
(
order by
salary range between unbounded preceding and
unbounded following
)
主要参考资料:《
expert one-on-
one
》
Tom Kyte
《
Oracle9i SQL Reference
》第
6
章
AVG
功能描述:用于计算一个组和数据窗口内表达式的帄均值。
<
/p>
SAMPLE
:下面的例子中列
c_ma
vg
计算员工表中每个员工的帄均薪水报告,该帄均值由当前员
工和与之具有相同经理的前一个和后一个三者的帄均数得来;
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
功能描述:返回一对表达式的相关系数,它是如下的缩写:
<
/p>
COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)
*STDDEV_POP(expr2))
从统计上讲,相关
性是变量之间关联的强度,变量之间的关联意味着在某种程度
上一个变量的值可由其它的值进行预测。通过返回一个
-1~1
之间的一个数
,
相关
系数给出了关联的强度,
0
表示不相关。
SAMPLE
:
下例返
回
1998
年月销售收入和月单位销售的关系的累积系数
(本例在
SH
用户下运行)
< br>
SELECT ar_month_number,
CORR (SUM(_sold), SUM(ty_sold))
OVER (ORDER BY ar_month_number) as
CUM_CORR
FROM sales s, times t
WHERE _id = _id AND calendar_year =
1998
GROUP BY ar_month_number
ORDER BY ar_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
功能描述:返回一对表达式的总体协方差。
< br>SAMPLE
:下例
CUM_COVP
< br>返回定价和最小产品价格的累积总体协方差
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
功能描述:返回一对表达式的样本协方差
SAMPLE
:下例
CUM_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
来记录去掉一组中完
全相同的数据后出现的行
数。
SAM
PLE
:下面例子中计算每个员工在按薪水排序中当前行附近薪水在
[n-50,n+150]
之间的行数,
n
表示当前行的薪水
例如,
P
hiltanker
的薪水
2200
,
排在他之前的行中薪水大于等于
2200-50
的有
1
行,排在他之后的
行中薪水小于等于
2200
+
150
的行没
有,所以
count
计数值
cnt3<
/p>
为
2
(包括自己当前行);
cnt2
值相当于小于等于当前行的
SALARY<
/p>
值的所有行数
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
总是返回大于<
/p>
0
、小于或等于
1
的数,该
数表示该行在
N
行中的位置
。例如,在一个
3
行的组中,返回的累计分布值为
1/3
、
2/3
、
3/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
时相等的)。密集的序列返回的时没有间隔的数
S
AMPLE
:下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与
RANK
函
数的区别)
SELECT ment_id , _name, ,
DENSE_RANK()
OVER
(PARTITION BY ment_id ORDER BY ) as
drank
FROM employees e,
departments d
WHERE ment_id = ment_id
AND ment_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
返回的集合中取出排在最前面的一个值的行(可能多行,因为值可
能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录
SAMPLE
:
下面例子中
DENSE_RANK
按部门分区,再按佣金<
/p>
commission_pct
排序,
F
IRST
取出
佣金最低的对应的所有行,然后前面的
MAX
函数从
这个集合
中取出薪水最低的值;
LAST
取出
佣
金最高的对应的所有行,然后前面的
MIN
函数从这个集合中取
出薪水最高的值
SELECT last_name,
department_id, salary,
MIN(salary) KEEP
(DENSE_RANK FIRST ORDER BY
commission_pct)
OVER
(PARTITION BY department_id)
MAX(salary) KEEP (DENSE_RANK LAST ORDER
BY commission_pct)
OVER
(PARTITION BY department_id)
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
功能描述:返回组中数据窗口的第一个值。
< br>SAMPLE
:下面例子计算按部门分区按薪水排序的数据窗口的第一个值对应的
名字,如果薪水的
第一个值有多个,则从多个对应的名字中取缺省排序的第一个名字
p>
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
SAMPLE
:下面的例子
中列
prev_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
返回的集合中取出排在最后面的一个值的行(可能多行,因为值可
能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录
SAMPLE
:
下面例子中
DENSE_RANK
按部门分区,再按佣金<
/p>
commission_pct
排序,
F
IRST
取出
佣金最低的对应的所有行,然后前面的
MAX
函数从
这个集合
中取出薪水最低的值;
LAST
取出
佣
金最高的对应的所有行,然后前面的
MIN
函数从这个集合中取
出薪水最高的值
SELECT last_name,
department_id, salary,
MIN(salary) KEEP
(DENSE_RANK FIRST ORDER BY
commission_pct)
OVER
(PARTITION BY department_id)
MAX(salary) KEEP (DENSE_RANK LAST ORDER
BY commission_pct)
OVER
(PARTITION BY department_id)
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
功能描述:
LEAD
与
LAG
相反,
LEAD
可以访问组中当前行之后的行
。
Offset
是一个正整数,其
默认
值为
1
,若索引超出窗口的范围,就返回默认值(默认返回的是
组中第一行)
SAMPLE
:下面的
例子中每行的
返回按
hire_dat
e
排序的下一行的
hire_date
值
SELECT last_name,
hire_date,
LEAD(hire_date,
1) OVER (ORDER BY hire_date) AS
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
功能描述:在一个组中的数据窗口中查找表达式的最大值。
<
/p>
SAMPLE
:下面例子中
dept_m
ax
返回当前行所在部门的最大薪水值
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
功能描述:在一个组中的数据窗口中查找表达式的最小值。
<
/p>
SAMPLE
:下面例子中
dept_m
in
返回当前行所在部门的最小薪水值
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
,则给组中的每一
行分配
一个数(从
1
到
4
),如果组中有
20
行,则
给前
5
行分配
1
,给下
5
行分配
< br>2
等等。如果组的基
数不能由表达式值帄均分开,则对这
些行进行分配时,组中就没有任何
percentile
的行数
比其它
percentile
的行
<
/p>
数超过一行,
最低的
percentil
e
是那些拥有额外行的
percentile
< br>。
例如,
若表达式
=4
,
行数
=21
,则
p>
percentile=1
的有
5
行,
percentile=2
的有
5
行等等。
SAMP
LE
:下例中把
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-1
(
n
为组中所有的行数)。该函数总是返回
0
~<
/p>
1
(包括
1
)之
间的
数。
SAMPLE
:下例中如果
Khoo
的
s
alary
为
2900
,则
pr
值为
0.6
,因为<
/p>
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
:在下例中,对于部门
60
的
Percentile_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)
PERCENT_RANK()
OVER (PARTITION BY department_id ORDER
BY salary)
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
的区别在找不到对应的分布值时返回的替代值的计算
方法
不同
SAMPLE
:下例中
0.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)
CUME_DIST() OVER (PARTITION BY
department_id ORDER BY salary)
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
RANK
功
能描述:根据
ORDER BY
子句中
表达式的值,从查询返回的每一行,计算它们与其它行的相
对位置。组内的数据按
ORDER BY
子句排序,然后给每一行赋一个号,从而形成一个序
列,该
序列从
1
开始,往后累加。每次
ORDER BY
表达式的值发生变化时,该序列也随之增加。
有同
样值的行得到同样的数字序号(认为
null
时相等的)。然而,如果两行的确得到同样的排序,则
序数将随
后跳跃
。
若两行序数为<
/p>
1
,
则没有序数
2
,
序列将给组中的下一行分配值
3<
/p>
,
DENSE_RANK
则没有任何跳跃
。
SAMPLE
:下例中计算每个员
工按部门分区再按薪水排序,依次出现的序列号(注意与
DENSE_RANK
函数的区别)
SELECT ment_id
, _name, , RANK()
OVER
(PARTITION BY ment_id ORDER BY ) as
drank
FROM employees e,
departments d
WHERE ment_id = ment_id
AND ment_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))<
/p>
的值,它给出相对于总数的百分比,即当前行
对
< br>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
< br>:返回回归线的决定系数,计算式为:
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 1
:下例计算
< br>1998
年最后三个星期中两种产品(
260
和
270
)在周末的销售量中已开发
票数量和总数量的累积斜率和回归线的截距
SELECT _month_number
REGR_SLOPE(_sold, ty_sold)
OVER (ORDER BY _month_desc,
_number_in_month) AS CUM_SLOPE,
REGR_INTERCEPT(_sold, ty_sold)
OVER (ORDER BY _month_desc,
_number_in_month) AS CUM_ICPT
FROM sales s, times t
WHERE
_id = _id
AND _id IN (270,
260)
AND _year=1998
AND _week_number IN (50, 51, 52)
AND _number_in_week IN (6,7)
ORDER BY _month_desc,
_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 2
:下例计算
1998
年
4
月每天的累积交易数量
SELECT UNIQUE _number_in_month,
REGR_COUNT(_sold, ty_sold)
OVER (PARTITION BY _month_number ORDER
BY _number_in_month)
FROM sales s, times t
WHERE _id = _id
AND _year = 1998 AND _month_number =
4;
DAY_NUMBER_IN_MONTH
Regr_Count
-------------------
----------
1 825
2 1650
3 2475
4 3300
.
.
.
26 21450
30 22200
SAMPLE 3
:下例计算
1998
年每月销售量中已
开发票数量和总数量的累积回归线决定系数
SELECT
_month_number,
REGR_R2(SUM(_sold),
SUM(ty_sold))
OVER (ORDER BY
_month_number)
FROM sales s, times t
WHERE _id = _id
AND _year =
1998
GROUP BY _month_number
ORDER BY _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 4
:下例计算
1998
年
12
月最后两周产品
260
的销售量中已开发票数量和总数量的累积
帄均值
SELECT _number_in_month,
REGR_AVGY(_sold, ty_sold)
OVER (ORDER BY _month_desc,
_number_in_month)
REGR_AVGX(_sold, ty_sold)
OVER (ORDER BY _month_desc,
_number_in_month)
FROM sales
s, times t
WHERE _id = _id
AND _id = 260
AND
_month_desc = '1998-12'
AND
_week_number IN (51, 52)
ORDER BY
_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
:下例计算产品
26
0
和
270
在
1998
年
2
月周末销售量中已开发票
数量和总数量的累积
REGR_SXY, REGR_SXX, and
REGR_SYY
统计值
SELECT _number_in_month,
REGR_SXY(_sold, ty_sold)
OVER (ORDER BY _year, _month_desc)
REGR_SYY(_sold, ty_sold)
OVER (ORDER BY _year, _month_desc)
REGR_SXX(_sold, ty_sold)
OVER (ORDER BY _year, _month_desc)
FROM sales s, times t
WHERE _id = _id
AND prod_id IN (270, 260)
AND _month_desc = '1998-02'
AND _number_in_week IN (6,7)
ORDER BY _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_NAM
E
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)
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 D
eviation
-
Population
)
SAMPLE
:下例返回部门
20
、
30
、
60
的薪水值的总体标准偏差
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 Deviation
-
Sample
)
SAMPLE
:下例返回部门
20
、
30
、
60
的薪水值的样本标准偏差
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
)该函数返回非空集合的总体变量(忽略
null
),
VAR_POP
进行
如下计算
:
(SUM(expr2) - SUM(expr)2 /
COUNT(expr)) / COUNT(expr)
SAMPLE
:下例计算
1998
年每月销售的累积总体和样本变
量(本例在
SH
用户下运行)
SELECT ar_month_desc,
VAR_POP(SUM(_sold))
OVER (ORDER BY ar_month_desc)
VAR_SAMP(SUM(_sold))
OVER (ORDER BY ar_month_desc)
FROM sales s, times t
WHERE _id = _id AND ar_year = 1998
GROUP BY ar_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
)该函数返回非空集合的样本变量(忽略
null
),
VAR_POP
进行如
下计算:
(SUM(expr*expr)-SUM(expr)*SUM(
expr)/COUNT(expr))/(COUNT(expr)-1)
SAMP
LE
:下例计算
1998
年每月销售的
累积总体和样本变量
-
-
-
-
-
-
-
-
-
上一篇:传播学经典理论英文翻译(可编辑修改word版)
下一篇:考研笔记:传播学专业英语