关于标准SQL(结构化查询语言)的版本问题

关于标准SQL(结构化查询语言)的版本问题,第1张

不管是T-SQL还是T-SQL增强版都是从标准的SQL语言演化来的,可能局部语法上有一些改动,但总体上都是一样的。况且SQL Server的每个版本都具有很好的前向兼容性。所以在2008中使用2005的语言格式不会有任何问题。。

 ROLLUP和CUBE 用法     

      Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是Group by  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),最后对全表进行GROUP BY *** 作。 grouping_id()可以美化效果。除了使用GROUPING函数,还可以使用GROUPING_ID来标识GROUP BY的结果。

       也可以 Group by Rollup(A,(B,C)) ,Group by A Rollup(B,C),…… 这样任意按自己想要的形式结合统计数据,非常方便。

Rollup():分组函数可以理解为group by的精简模式,具体分组模式如下:

  Rollup(a,b,c): (a,b,c),(a,b),(a),(全表)

Cube():分组函数也是以group by为基础,具体分组模式如下:

  cube(a,b,c):(a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),(全表)

下面准备数据比较一下两个函数的不同:

1、准备数据:

2、使用rollup函数查询

select group_id,job,name,sum(salary) from GROUP_TEST group by rollup(group_id,job,name);

3、使用cube函数:

select group_id,job,name,sum(salary) from GROUP_TEST group by cube(group_id,job,name)

 

4、对比:从最后查询出来的数据条数就差了好多,下面看一下将两个函数从转化成对应的group函数语句:

 

rollup函数:

select group_id,job,name,sum(salary) from GROUP_TEST group by rollup(group_id,job,name);

等价于:

select group_id,job,name,sum(salary) from GROUP_TEST group by group_id,job,name

union all

select group_id,job,null,sum(salary) from GROUP_TEST group by group_id,job

union all

select group_id,null,null,sum(salary) from GROUP_TEST group by group_id

union all

select null,null,null,sum(salary) from GROUP_TEST

 

cube函数:

select group_id,job,name,sum(salary) from GROUP_TEST group by cube(group_id,job,name) ;

等价于:

select group_id,job,name,sum(salary) from GROUP_TEST group by group_id,job,name

union all

select group_id,job,null,sum(salary) from GROUP_TEST group by group_id,job

union all

select group_id,null,name,sum(salary) from GROUP_TEST group by group_id,name

union all

select group_id,null,null,sum(salary) from GROUP_TEST group by group_id

union all

select null,job,name,sum(salary) from GROUP_TEST group by job,name

union all

select null,job,null,sum(salary) from GROUP_TEST group by job

union all

select null,null,name,sum(salary) from GROUP_TEST group by name

union all

select null,null,null,sum(salary) from GROUP_TEST

 

5、由此可见两个函数对于汇总统计来说要比普通函数好用的多,另外还有一个配套使用的函数

grouping():当字段为null的时候值为1,当字段非null的时候值为0;

select grouping(group_id),job,name,sum(salary) from GROUP_TEST group by rollup(group_id,job,name);

 

6、添加一列用来直观的显示所有的汇总字段:

select group_id,job,name,

 case when name is null and nvl(group_id,0)=0 and job is null   then '全表聚合'

   when name is null and nvl(group_id,0)=0 and job is not null then 'JOB聚合'

   when name is null and  grouping(group_id)=0 and job is null then 'GROUPID聚合'

   when name is not null and nvl(group_id,0)=0 and job is null   then 'Name聚合'

   when name is not null and grouping(group_id)=0 and job is null   then 'GROPName聚合'

   when name is not null and grouping(group_id)=1 and job is not null   then 'JOBName聚合'

   when name is  null and grouping(group_id)=0 and job is not null   then 'GROUPJOB聚合'

    else

 '三列汇总' end ,

sum(salary) from GROUP_TEST group by cube(group_id,job,name) ;

本文是对pandas官方网站上《10 Minutes to pandas》的一个简单的翻译,原文在这里。这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook 。习惯上,我们会按下面格式引入所需要的包:

一、 创建对象

可以通过 Data Structure Intro Setion 来查看有关该节内容的详细信息。

1、可以通过传递一个list对象来创建一个Series,pandas会默认创建整型索引:

2、通过传递一个numpy array,时间索引以及列标签来创建一个DataFrame:

3、通过传递一个能够被转换成类似序列结构的字典对象来创建一个DataFrame:

4、查看不同列的数据类型:

5、如果你使用的是IPython,使用Tab自动补全功能会自动识别所有的属性以及自定义的列,下图中是所有能够被自动识别的属性的一个子集:

二、 查看数据

详情请参阅:Basics Section

1、 查看frame中头部和尾部的行:

2、 显示索引、列和底层的numpy数据:

3、 describe()函数对于数据的快速统计汇总:

4、 对数据的转置:

5、 按轴进行排序

6、 按值进行排序

三、 选择

虽然标准的Python/Numpy的选择和设置表达式都能够直接派上用场,但是作为工程使用的代码,我们推荐使用经过优化的pandas数据访问方式: at, iat, loc, iloc 和 ix详情请参阅Indexing and Selecing Data 和 MultiIndex / Advanced Indexing。

l 获取

1、 选择一个单独的列,这将会返回一个Series,等同于dfA:

2、 通过[]进行选择,这将会对行进行切片

l 通过标签选择

1、 使用标签来获取一个交叉的区域

2、 通过标签来在多个轴上进行选择

3、 标签切片

4、 对于返回的对象进行维度缩减

5、 获取一个标量

6、 快速访问一个标量(与上一个方法等价)

l 通过位置选择

1、 通过传递数值进行位置选择(选择的是行)

2、 通过数值进行切片,与numpy/python中的情况类似

3、 通过指定一个位置的列表,与numpy/python中的情况类似

4、 对行进行切片

5、 对列进行切片

6、 获取特定的值

l 布尔索引

1、 使用一个单独列的值来选择数据:

2、 使用where *** 作来选择数据:

3、 使用isin()方法来过滤:

l 设置

1、 设置一个新的列:

2、 通过标签设置新的值:

3、 通过位置设置新的值:

4、 通过一个numpy数组设置一组新值:

上述 *** 作结果如下:

5、 通过where *** 作来设置新的值:

四、 缺失值处理

在pandas中,使用npnan来代替缺失值,这些值将默认不会包含在计算中,详情请参阅:Missing Data Section。

1、 reindex()方法可以对指定轴上的索引进行改变/增加/删除 *** 作,这将返回原始数据的一个拷贝:、

2、 去掉包含缺失值的行:

3、 对缺失值进行填充:

4、 对数据进行布尔填充:

五、 相关 *** 作

详情请参与 Basic Section On Binary Ops

统计(相关 *** 作通常情况下不包括缺失值)

1、 执行描述性统计:

2、 在其他轴上进行相同的 *** 作:

3、 对于拥有不同维度,需要对齐的对象进行 *** 作。Pandas会自动的沿着指定的维度进行广播:

Apply

1、 对数据应用函数:

直方图

具体请参照:Histogramming and Discretization

字符串方法

Series对象在其str属性中配备了一组字符串处理方法,可以很容易的应用到数组中的每个元素,如下段代码所示。更多详情请参考:Vectorized String Methods

六、 合并

Pandas提供了大量的方法能够轻松的对Series,DataFrame和Panel对象进行各种符合各种逻辑关系的合并 *** 作。具体请参阅:Merging section

Concat

Join 类似于SQL类型的合并,具体请参阅:Database style joining

Append 将一行连接到一个DataFrame上,具体请参阅Appending:

七、 分组

对于”group by” *** 作,我们通常是指以下一个或多个 *** 作步骤:

(Splitting)按照一些规则将数据分为不同的组;

(Applying)对于每组数据分别执行一个函数;

(Combining)将结果组合到一个数据结构中;

详情请参阅:Grouping section

1、 分组并对每个分组执行sum函数:

2、 通过多个列进行分组形成一个层次索引,然后执行函数:

八、 Reshaping

详情请参阅 Hierarchical Indexing 和 Reshaping。

Stack

数据透视表,详情请参阅:Pivot Tables

可以从这个数据中轻松的生成数据透视表:

九、 时间序列

Pandas在对频率转换进行重新采样时拥有简单、强大且高效的功能(如将按秒采样的数据转换为按5分钟为单位进行采样的数据)。这种 *** 作在金融领域非常常见。具体参考:Time Series section。

1、 时区表示:

2、 时区转换:

3、 时间跨度转换:

4、 时期和时间戳之间的转换使得可以使用一些方便的算术函数。

十、 Categorical

从015版本开始,pandas可以在DataFrame中支持Categorical类型的数据,详细 介绍参看:categorical introduction和API documentation。

1、 将原始的grade转换为Categorical数据类型:

2、 将Categorical类型数据重命名为更有意义的名称:

3、 对类别进行重新排序,增加缺失的类别:

4、 排序是按照Categorical的顺序进行的而不是按照字典顺序进行:

5、 对Categorical列进行排序时存在空的类别:

十一、 画图

具体文档参看:Plotting docs

对于DataFrame来说,plot是一种将所有列及其标签进行绘制的简便方法:

十二、 导入和保存数据

CSV,参考:Writing to a csv file

1、 写入csv文件:

2、 从csv文件中读取:

HDF5,参考:HDFStores

1、 写入HDF5存储:

2、 从HDF5存储中读取:

Excel,参考:MS Excel

1、 写入excel文件:

2、 从excel文件中读取:

来自为知笔记(Wiz)

概述

今天主要分享下Oracle数据库分组函数group by 、 rollup、cude、grouping 、grouping sets的常用用法,以下以Oracle自带schema做演示。

1、group by的使用

--根据DEPTNO和JOB进行分组。求相同DEPTNO,相同JOB的员工工资总和。

SELECT EDEPTNO,EJOB,SUM(ESAL) FROM EMP E GROUP BY EDEPTNO,EJOB ORDER BY EDEPTNO;

2、group by 配合rollup的使用

rollup()--可以使用一个或者多个参数。意思是从右向左进行数据的汇总统计,并生成一行,rollup是个统计函数。

以下是根据分组情况进行统计,最终进行全部汇总。

(1)简单的使用rollup--生成一行新数据。(要生成新的一行数据,还可以使用UNION ALL)

SELECT DDUMMY FROM DUAL D GROUP BY ROLLUP(DDUMMY);

(2)先根据EDEPTNO,EJOB进行分组,然后从右向左

SELECT EDEPTNO,EJOB,SUM(ESAL) FROM EMP E GROUP BY ROLLUP(EDEPTNO,EJOB) ORDER BY EDEPTNO;

针对以上的使用ROLLUP的结果的理解:

a:首先根据GROUP BY EDEPTNO,EJOB查询出9条数据(除4,8,12,13外),在根据rollup的定义,从右向左,对ROLLUP中的参数进行小计

首先根据JOB(对所有的JOB进行汇总),汇总出4,8,12行,在根据EDEPTNO(对所有的DEPTNO进行汇总),汇总出第十三行数据。

(3) 特殊情况

SELECT EDEPTNO,EJOB,SUM(ESAL) FROM EMP E GROUP BY ROLLUP(EJOB,EDEPTNO) ORDER BY EDEPTNO;

理解:首先根据GROUP BY EDEPTNO,EJOB查询出前九条数据,其次对EDEPTNO进行汇总,但是必须考虑JOB,也就是相同的JOB,的所有的工资总和,所以出现下面五条数据。

3、group by 配合cube的使用

SELECT EDEPTNO,EJOB,SUM(ESAL) FROM EMP E GROUP BY CUBE(EDEPTNO,EJOB) ORDER BY EDEPTNO;

理解:CUBE会对条件中的每一个条件进行单独的汇总:即对单独的列进行汇总

GROUP BY CUBE(EDEPTNO,EJOB)首先根据:GROUP BY EDEPTNO,EJOB查询数据,其次对EJOB进行汇总(不考虑DEPTNO,单独汇总,而ROLLUP是在同一个DEPTNO下面)再对EDEPTNO进行汇总,最后全部汇总。

cube(a,b) 统计列包含:(a,b)、(a)、(b)、()

cube(a,b,c) 统计列包含:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、(c)、()

4、GROUPING 的使用

GROUPING函数可以接受一列,返回0或者1。如果列值为空,那么GROUPING()返回1;如果列值非空,那么返回0。GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。

SELECT GROUPING(EDEPTNO), EDEPTNO,EJOB,SUM(ESAL) FROM EMP E GROUP BY ROLLUP(EDEPTNO,EJOB) ORDER BY EDEPTNO;

可以使用decode或者case函数进行转换这种不友好的显示:

SELECT

CASE WHEN grouping(EDEPTNO) = 1

THEN '总计'

ELSE EDEPTNO || ''

END AS 部门,

CASE WHEN grouping(EJOB) = 1 AND grouping(EDEPTNO) = 0

THEN '小计'

ELSE EJOB

END AS 工作种类,

SUM(ESAL) FROM EMP E GROUP BY ROLLUP(EDEPTNO,EJOB)

ORDER BY EDEPTNO;

SELECT DECODE(GROUPING(EDEPTNO), 1, '总计', EDEPTNO) AS 部门,

CASE

WHEN GROUPING(EJOB) = 1 AND GROUPING(EDEPTNO) = 0 THEN

'小计'

ELSE

EJOB

END AS 工作种类,

SUM(ESAL)

FROM EMP E

GROUP BY ROLLUP(EDEPTNO, EJOB)

ORDER BY EDEPTNO;

5、grouping sets提供了指定汇总集合条件的功能

根据EDEPTNO,EJOB分别汇总数据。

SELECT EDEPTNO,EJOB,SUM(ESAL) FROM EMP E GROUP BY GROUPING SETS(EDEPTNO,EJOB);

觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

 注意 )Oracle中的字符串是严格区分大小写的 日期和字符只能在单引号中出现

  )把列与列 列与字符连接在一起用 || 符号

  )列的别名 紧跟列名 也可以在列名和别名之间加入关键字 AS 以便在别名中包含空格或特殊的字符并区分大小写 使用双引号

 例子

 SELECT    last_name  ||  is a   ||  job_id   AS  Employee Details

 FROM    employees

 where    first_name  like  %s_ ;

 通用函数

 空值是无效的 未指定的 未知的或不可预知的值 空值不是空格或者 包含空值的数学表达式的值都为空值

 这些函数适用于任何数据类型 同时也适用于空值

 NVL (expr expr )

 NVL (expr expr expr )

 NULLIF (expr expr )

 COALESCE (expr expr exprn)

 ( )NVL (expr expr ) >expr 为NULL 返回expr 不为NULL 返回expr 注意两者的类型要一致

 ( )NVL (expr expr expr ) >expr 不为NULL 返回expr 为NULL 返回expr expr 和expr 类型不同的话 expr 会转换为expr 的类型

 ( )NULLIF (expr expr ) >相等返回NULL 不等返回expr

 ( )COALESCE(expr expr exprn) >列表中第一个非空的表达式是函数的返回值 如果所有的表达式都是空值 最终将返回一个空值

 条件表达式在SQL语句中使用IF THEN ELSE 逻辑 可以使用两种方法:–CASE表达式    CASE  expr  WHEN  parison_expr   THEN  return_expr                     [WHEN  parison_expr   THEN  return_expr                      WHEN  parison_exprn  THEN  return_exprn                     ELSE  else_expr]    END

 –DECODE函数    DECODE ( col | expression   search   result                 [ search result ]                [ default] )

 分组函数

 分组函数作用于一组数据 并对一组数据返回一个值

 组函数语法

 SELECT [column ] group_function(column)

 FROM table

 [WHERE condition]

 [GROUP BY column]

 [ORDER BY column];

 注意 在SELECT列表中所有未包含在组函数中的列都应该包含在GROUP BY子句中

 (所用包含于SELECT列表中 而未包含于组函数中的列都必须包含于GROUPBY子句中)

 但包含在GROUP BY 子句中的列不必包含在SELECT列表中

 且可以在在GROUP BY子句中包含多个列

 不能在WHERE子句中使用组函数 但可以在HAVING子句中使用组函数

 使用HAVING过滤分组

  行已经被分组

  使用了组函数

  满足HAVING子句中条件的分组将被显示

 SELECT column group_function

 FROM table

 [WHERE condition]

 [GROUP BY group_by_expression]

 [HAVING group_condition]

 [ORDER BY column];

 子查询

 语法

 SELECT select_list

 FROM table

 WHERE expr operator

 (SELECT select_list

 FROM table);

 注意 子查询(内查询) 在主查询之前一次执行完成

 子查询的结果被主查询使用(外查询)

 子查询要包含在括号内

 将子查询放在比较条件的右侧

 除非进行Top N 分析 否则不要在子查询中使用ORDER BY子句

 单行 *** 作符对应单行子查询 多行 *** 作符对应多行子查询

 单行 *** 作符operator                                                     多行 *** 作符operator

 =    等于                                                                            IN     等于列表中的任何一个

 >    大于                                                                            ANY  和子查询返回的任意一个值比较

 >=  大于等于                                                                    ALL   和子查询返回的所有值比较

 <    小于                                                                            EXISTS  功能等价于IN

 <=  小于等于

 <>  不等于

 DECODE和CASE SELECT中除GROUP BY 子句以外的所有子句中 都可以使用单行子查询

 在子查询中使用HAVING子句

 SELECT select_list

 FROM table

 [GROUP BY group_by_expression]

 [HAVING group_condition] expr operator

 (SELECT select_list

 FROM table);

 在FROM子句中使用子查询 例子

 SELECT a last_name a salary a department_id b salavg

 FROM employees a (SELECT department_id AVG(salary) salavg

 FROM employees

 GROUP BY department_id) b

 WHERE a department_id = b department_id

 AND   a salary > b salavg;

 有两个简单例子 以说明 exists 和 in 的效率问题

  ) select from T where exists(select from T where T a=T a) ;

 T 数据量小而T 数据量非常大时 T <<T 时 ) 的查询效率高

  ) select from T where T a in (select T a from T ) ;

 T 数据量非常大而T 数据量小时 T >>T 时 ) 的查询效率高

 exists 用法

 请注意 )句中的有颜色字体的部分 理解其含义

 其中 select from T where T a=T a 相当于一个关联表查询 相当于

  select from T T      where T a=T a

 但是 如果你当当执行 ) 句括号里的语句 是会报语法错误的 这也是使用exists需要注意的地方

  exists(xxx) 就表示括号里的语句能不能查出记录 它要查的记录是否存在

 因此 select 这里的 其实是无关紧要的 换成 也没问题 它只在乎括号里的数据能不能查找出来 是否存在这样的记录 如果存在 这 ) 句的where 条件成立

 in 的用法

 继续引用上面的例子

  ) select from T where T a in (select T a from T )

 这里的 in 后面括号里的语句搜索出来的字段的内容一定要相对应 一般来说 T 和T 这两个表的a字段表达的意义应该是一样的 否则这样查没什么意义

 打个比方 T T 表都有一个字段 表示工单号 但是T 表示工单号的字段名叫 ticketid T 则为 id 但是其表达的意义是一样的 而且数据格式也是一样的 这时 用 )的写法就可以这样

  select from T where T ticketid in (select T id from T )

 EXISTS *** 作符

 EXISTS *** 作符检查在子查询中是否存在满足条件的行

  如果在子查询中存在满足条件的行

 – 不在子查询中继续查找

 – 条件返回TRUE

  如果在子查询中不存在满足条件的行

 – 条件返回FALSE

 – 继续在子查询中查找

 相关子查询

 相关子查询按照一行接一行的顺序执行 主查询的每一行都执行一次子查询 子查询使用了主查询中的列

 SELECT  column column

 FROM  table outer

 WHERE columnk operator (SELECT  colum colum

 FROM  table

 WHERE expr= outer expr);

 相关更新

 使用相关子查询依据一个表中的数据更新另一个表的数据

 UPDATE  table alias

 SET  column = (SELECT  expression

 FROM  table   alias

 WHERE  lumn = lumn);

 相关删除

 使用相关子查询依据一个表中的数据删除另一个表的数据

 DELETE FROM  table alias

 WHERE  column operator (SELECT  expression

 FROM  table alias

 WHERE lumn = lumn);

 WITH子句

  使用WITH子句 可以避免在SELECT语句中重复书写相同的语句块

  WITH子句将该子句中的语句块执行一次 并存储到用户的临时表空间中

  使用WITH子句可以提高查询效率

 我们可以使用WITH  Clause来定义一个query   block 然后在SELECT   statement的其它地方使用这个query   block 如果在一个很复杂的 Query 里 我们必须重复地使用某个 subquery 那么使用WITH   Clause可以降低Query的复杂度以及提高 performance 因为WITH   Clause 所读出的资料会暂存在User的temporary   tablespace中

 WITH子句应用举例

 WITH

 dept_costs AS (SELECT  d department_name SUM(e salary) AS dept_total

 FROM  employees e departments d

 WHERE  e department_id = d department_id

 GROUP BY  d department_name)

 avg_cost  AS (SELECT  SUM(dept_total)/COUNT() AS dept_avg

 FROM  dept_costs)

 SELECT 

 FROM  dept_costs

 WHERE  dept_total > (SELECT  dept_avg

 FROM  avg_cost)

 ORDER BY  department_name;

 GROUP BY 扩展

 带有ROLLUP和CUBE *** 作的GROUP BY子句

  使用带有ROLLUP和CUBE *** 作的GROUP BY子句产生多种分组结果

  ROLLUP产生n + 种分组结果 其是对GROUP BY子句的扩展

  CUBE产生 的n次方种分组结果 其是对GROUP BY子句的扩展

 注 其中的n指的是group_by_expression的数目

 ROLLUP *** 作符 ROLLUP产生n + 种分组结果 顺序是从右向左

 SELECT  [column ] group_function(column)

 FROM  table

 [WHERE condition]

 [GROUP BY [ROLLUP] group_by_expression]

 [HAVING having_expression]

 [ORDER BY column];

 CUBE *** 作符 CUBE会产生类似于笛卡尔集的分组结果

 SELECT  [column ] group_function(column)

 FROM  table

 [WHERE condition]

 [GROUP BY [CUBE] group_by_expression]

 [HAVING having_expression]

 [ORDER BY column];

 GROUPING函数 能够实现更加直观的分组结果显示提示

 SELECT  [column ] group_function(column) [GROUPING(group_by_expression)]

 FROM  table

 [WHERE condition]

 [GROUP BY  [ROLLUP] [CUBE] group_by_expression]

 [HAVING having_expression]

 [ORDER BY column];

  GROUPING函数可以和CUBE或ROLLUP结合使用

  使用GROUPING函数 可以找到哪些列在该行中参加了分组

  使用GROUPING函数 可以区分空值产生的原因

  GROUPING函数返回 或

 GROUPING SETS

  GROUPING SETS是对GROUP BY子句的进一步扩充

  使用GROUPING SETS可以实现在同一个查询中定义多个分组集

  Oracle 对GROUPING SETS子句指定的分组集进行分组后用UNION ALL *** 作将各分组结果结合起来

  Grouping set 的优点

 – 只进行一次分组即可

 – 不必书写复杂的UNION语句

 – GROUPING SETS中包含的分组项越多性能越好

 以下例子实现了对department_id job_id分组 对job_id manager_id分组 最终形成两个分组

 SELECT  department_id job_id manager_id avg(salary)

 FROM  employees

 GROUP BY GROUPING SETS ((department_id job_id) (job_id manager_id));

 复合列

  复合列是被作为整体处理的一组列的集合

  使用括号将若干列组成复合列在ROLLUP或CUBE中作为整体进行 *** 作

  在ROLLUP或CUBE中 复合列可以避免产生不必要的分组结果

 例如 GROUP BY ROLLUP( department_id (job_id manager_id)); //小括号实现复合列

 连接分组集

  连接分组集可以产生有用的对分组项的结合

  将各分组集 ROLLUP 和CUBE用逗号连接 Oracle自动在GROUP BY子句中将各分组集进行连接

  连接的结果是对各分组生成笛卡尔集

 例如 GROUP BY GROUPING SETS(a b) GROUPING SETS(c d);

lishixinzhi/Article/program/Oracle/201311/18505

从原有变量计算新变量

从头定义变量的情况多数在建立数据集时出现。但是,当数据集已经建立,需要整理、转换变量时,碰到的更多情况是需要根据某种条件从原有变量计算新变量。下面我们将按菜单条目的顺序依次讲解他们的功能。但是,首先我们需要了解一下所用的对话框界面的情况。

SPSS对话框元素介绍

这是一个非常典型的SPSS对话框。它包含了许多具有SPSS特色的对话框元素:

对话框左侧为候选变量列表框,里面列出了可被该对话框使用的变量;

右上方为Test Variables框,可将变量选入其中;注意在两个框的中间用“”相连,这是变量移动按钮,其方向表明是将变量从那个框移动到哪个框,上图中我们选中了变量group,两个移动按钮均变黑并向右指,表明变量group可以移动到他们右侧的两个框里去,改变当前框(在其他两个框里单击),移动按钮就会转向、变灰等以表明不同的意思(墙头草一个,可别小看这个功能,我想用VB实现这个功能,也是费了些工夫才把它搞定了);

右侧为一排五个按钮,分别是确定、粘贴、重置、取消和帮助。这五个兄弟也是几乎永远一起出现的,另外四个大家都比较熟悉了,重置(Reset)按钮用于取消对话框内已做的选择,恢复到默认的状态;

最下方有个Options按钮,用于设置专门用于该对话框的选项;

OK、Paste两个按钮为灰色,表明所需条件尚未满足,该按钮暂不可用。同理,Grouping Variable框下方的Define Groups按钮为灰色显示,也表明暂不可用。

Compute Variable对话框

例32 在li1_1sav中建立新变量temp,令其值当血磷值大于1时为2,否则为1。

解:这里需要用到Compute Variable对话框,外加一点技巧。首先给变量temp均赋值为1,然后将血磷值大于1的记录其temp变量值改为2即可。选择菜单Transform==>Compute,d出Compute Variable对话框如下:

左上角为需要计算的变量名,在其中键入“temp”,此时“Type&Lable”按钮就会变黑,喜欢精确的朋友可以在这里对temp进行详细的定义,但如果你和我一样非常懒,就可以对它视而不见(不要生气,聪明人大多都非常懒:));左下方为候选变量列表,现在还用不着;中部为类似计算器的软键盘,可以用鼠标按键输入数字和符号,这里我们直接输入“1”,输入的内容回立刻在右上方的数值表达式窗口中出现;软键盘右侧为函数窗口,可以在这里找到并使用所需的SPSS函数;这次也用不到。好,现在“OK”按钮已经变黑,单击他,系统就会自动生成一个新变量temp,并且取值均为1。

软键盘上几个奇奇怪怪的符号的含义如下:

~= & | ~

不等号,等价于> 逻辑符号AND 逻辑符号OR 乘方,相当于函数EXP() 逻辑符号NOT

在函数窗口中选中某个函数并单击右键,系统就会d出该函数的用法说明。

函数主要是和变量名组合起来使用的,比如说ABS(x)就是取变量x的绝对值。

好,现在开始进行第二步,再次选择菜单Transform==>Compute,系统也再次d出这个对话框--等等!注意到了吗?该对话框自动记住了你上次输入的内容,几乎所有SPSS的对话框都有这个特性,这会大大方便我们的使用。好,将数值表达式窗口中的1改为2,然后单击中下部的“If”按钮,系统d出记录选择对话框如下:

不需要太多解释,大部分内容都是前面见过的。由于我们这里不是对所有记录做变换,因此选中第二个单选钮“Include if case statisfies confition:”,此时下方的所有窗口变亮,表明现在可用;而“Continue”按钮变灰,表明当前还没有提供所需的信息,好,我们就来提供,在左侧选中血磷值(x),然后单击“”,x就被引入了右侧的变量框,任你用键盘或者用鼠标,总之将下面这个算式补充完:x>1。现在可见“Continue”按钮再度变黑。在它又变灰之前赶快单击它(开个玩笑),系统回到Compute Variable对话框,请注意If按钮右侧的变化:x>2。如果你做的结果不一样,请重来一遍。

现在单击“OK”按钮,由于我们要替换变量值,系统会d出一个确认对话框,确认替换,马上你就会看到,我们已经把这道题做完了。

Count对话框

Count对话框用于计算某个值或某些值在某个变量的取值中是否出现(好象有点拗口),比如我们想看看有哪些记录的血磷值在2~3之间,选择菜单Transform==>Count,系统d出Count对话框如下:

Target Variable框中用于指定记录变量值是否出现的变量名,在这里输入temp2;选中血磷值(x),将其选入Variables窗口,此时“Define Values”按钮变黑,单击它,系统d出变量值定义窗口如下:

左半部为变量值定义窗口,可以定义某个值、系统缺失值、系统或用户定义缺失值、变量值范围、小于某值或大于某值。我们这里是第四种情况:选择Range,在through两侧分别键入2、3,然后单击已变黑的“Add”按钮,“2 thru 3”就会被加入“Values to Count”框内。然后单击“Continue”,再单击Count对话框的“OK”,可以看到系统自动生成变量temp2,其中10、11号记录因血磷值介于2和3之间,temp2取值为1,其余的记录temp2取值均为0。

SOS,SOS,请大家千万注意,Count对话框有一个潜在的bugs,当你需要计算同时满足两个变量取值条件的记录数有多少时,直接用该对话框会得出完全错误的结果。这里有一点技巧,需要对对话框生成的指令加以修改,至于怎么修改嘛,我们将在Syntax(语法)窗口使用详解一章中讲述 :)。

Recode对话框

Recode对话框用于从原变量值按照某种一一对应的关系生成新变量值,可以将新值赋给原变量,也可以生成一个新变量。

例23 在Li1_1sav中生成新变量temp3,当血磷值小于1时取值为0,1~2时取值为10,大于2时取值为20。

解:选择菜单Transform==>Record==>Into Different Variables,Recode对话框如下:

将血磷值(x)选入Input Variable->Output Variable框,此时Output Variable框变黑,在其中键入新变量名temp3并单击Change,可见原来的x->变成了x->temp3。现在单击“Old and New Values”,系统d出变量值定义对话框如下:

许多东西和前面类似,不再重复。按照题目的要求,选择Range:Lowest through,在右侧框中键入1,然后在右上方的Value右侧框中键入对应的新变量值0,此时下方Add键变黑,单击它,Old->New框中就会加入Lowest thru 1->0,按照类似的方法依次加入另两条转换规则,最终Old->New框中共有Lowest thru 1->0、1 thru 2->10、Else->20三条,现在单击Continue,再单击OK,系统就会按要求生成新变量temp3。

哎呀不得了,太多了,虽然这样非常直观,但下载速度太慢了。等大家对基本界面 *** 作熟悉了后,我们将对比较简单的对话框试着对 *** 作用文字的方式描述,比如上面的 *** 作我们将用文字表达为:

Output Variable框:选入x

Output Variable Name框:键入temp3:单击Change钮

选中x->temp3:单击Old and New Values钮:

Range:Lowest through单选钮:键入1:New Value Value单选钮:键入0:单击Add钮

Range: through单选钮:两侧分别键入1、2:New Value Value单选钮:键入10:单击Add钮

Range: All other values单选钮:New Value Value单选钮:键入20:单击Add钮

单击Continue

单击OK

怎么样,还能理解吧。

Categorize Variables对话框

Categorize Variables对话框用于将连续性变量自动按要求分成等间距的几类。其界面非常简单,许多东西都是我们所熟悉的,唯一特别的是右下方的number of categories框,用于输入变量的等级数,默认为4,比如我们希望将血磷值按大小分成5个等级,先将血磷值选入Create Categories框,然后将下面的4改为5,单击OK,就会看到系统产生了一个新变量nx(即number of x之意),其取值就对应了血磷值相应的5个等级(1~5)。重复一下,具体 *** 作步骤为:

Create Categories框:选入x

Number of categories框:5

OK

Rank Cases对话框

例24 请分组计算血磷值的秩和。

解:选择菜单Transform==>Rank Cases,d出Rank Cases对话框如下:

将血磷值选入Variable框,分组变量选入By框,单击OK即可。系统会建立一个新变量rx(即原变量名前加r表示Rank之意),其取值为x分组的秩次。

解释一下Rank Cases对话框的其他几个零件:

左下角的Assign Rank 1 to框架用于选择将秩次1赋给最小值还是最大值;

中下部的Display summary tables复选框用于确定是否在结果窗口内输出结果报表;

Rank Types钮用于定义秩次类型,有Rank(秩分数)、Savage评分(新变量值按指数分布)、Fractional rank(新变量值是秩分数除以非缺失值观测量的权重之和)、Fractional rank %(新变量值是秩分数除以非缺失值观测量数乘100)、Sum of case weights(新变量值是各观测量的权重之和)、Ntiles(新变量值是按所选变量的百分位数分组的组序号),默认值为Rank。单击More按钮,还会有更多的设置,这里就不再讲了。

Ties钮用于定义对相同值观测量的处理方式,可以是取平均秩次、最小值、最大值或当作一个记录处理,默认值为取平均秩次。

Automatic Record对话框

该对话框用于按原变量值的大小生成新变量,变量值就是原值的大小次序,功能和Rank Cases对话框重复(等价于相同值观测量当作一个记录处理的情况)。

Create Time Series对话框

用于自动生成时间序列变量,由于太专业,这里不做过多解释。

Replace Missing Value对话框

用于填充缺失值,结果存入一个新变量。填充方法有:序列的均数、相邻若干点的均数、相邻若干点的中位数、线性内插、线性外延,默认值为序列的均数。

222 数据的录入

2221 直接录入

我想直接录入的问题就不用多讲了吧,直接敲就是了!

2222 数据录入技巧

和其他常用统计软件相比,SPSS数据界面最大的优势就是支持鼠标的拖放 *** 作,以及拷贝粘贴等命令,下面的数据录入技巧就是对这些功能的利用。

连续多个相同值的输入

如前面group变量有连续多个1,如果直接输入,可以在第一格内输入1并回车,然后回到刚才的单元格并单击右键,选择copy,最后用拖放方式选中所有应输入1的单元格,单击右键并选择paste,所有选中的单元格就会都被刚才拷贝的1填充。

将EXCEL数据直接引入SPSS

Excel已经打开原数据,并且数据量较少的时候,可以直接用拷贝粘贴的方法将数据引入SPSS:先在EXCEL中选中所有的数据(不包括变量名),然后选择拷贝命令;然后切换到SPSS,最好使行1列1单元格成为当前单元格,然后执行粘贴命令,数据就会全部转入SPSS,再定义相应的变量即可。

http://hibaiducom/htmlblog/blog/item/882cd00890b9e4d562d986cfhtml

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12182002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存