社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
SQL(Structured Query Language),在SAS中可以通过调用过程步 PROC SQL 使用。
NOPRINT: 使用SELECT语句查询时,SQL过程通常会在输出窗口输出数据,使用NOPRINT选项可以阻止输出。
DISTINCT: 剔除查询结果中重复的观测。select distinct column_name from able_name。
SELECT: SQL过程中最常用的语句,通常后跟FROM。
ORDER BY: 对数据进行排序,其效果等同于SORT BY,可以全等替代。
DISCRIBE: 描述一个数据集或数据表的变量名及属性。describe table table_name。类似作用的还有proc contents data=dataset;
QUIT: PROC SQL语句通常在遇到QUIT时停止,但如果没有QUIT,则在遇到下一个DATA步或PROC步时停止。
PROC SQL语句与MERGE语句的对比,有如下两表:
level | china |
---|---|
0 | c01 |
1 | c02 |
2 | c03 |
3 | c04 |
level | usa |
---|---|
1 | u00 |
2 | u01 |
2 | u02 |
3 | u03 |
4 | u04 |
data pingpang;
merge resdat.China resdat.USA;
run;
#output
level china usa
1 c01 u00
2 c02 u01
2 c03 u02
3 c04 u03
4 u04
merge后接数据集名,在merge中,如果china与usa变量名相同,则以usa为准覆盖china的变量。而如果不同,则像上例一样,依旧以usa为准,依次连接china。
使用SQL时:
proc sql;
create table as
select a.level China USA
from resdat.china as a
inner join
resdat.usa as b
on a.level=b.level
;
select * from pingpang;
quit;
#output
level china usa
1 c02 u00
2 c03 u02
2 c03 u01
3 c04 u03
在SQL中应具体匹配到关键字,然后会从笛卡儿积中选取两个表中同时都存在的观测作为内连接。
笛卡儿积意为两个表循环进行匹配,一个5条记录的表与一个4条记录的表能够产生的笛卡儿积为5*4=20,以下为sas中求笛卡尔积的代码段:
proc sql outobs=3;
select inner1.*,inner2.*
from inner1,inner2
;
quit;
outobs表示输出的观测数,对应inobs,类似于firstobs和obs的作用。
当使用as为变量分配别名时,别名只在当前的查询中有效。
CASE语句:使用CASE语句时可以设定带有逻辑条件的语句,例如:
proc sql;
select *
case
when x = '1' then 'sh'
when x = '2' then 'xz'
else 'others'
end as x
from table_name
order by column_name;
quit;
CASE表达式的最后必须使用END关键字。
在输出时,可以制定输出的COLUMN的格式,比如format、informat、label、lenth。如select column_name label = 'today price' column2_name format = comma 10.2
可以通过某列的位置指定其作为排序键,比如select name1 name2 name3 from table_name order by 3 desc; 由此语句可以得到以第3列name为关键字进行排序的结果。
WHERE 语句:
contains: where column_name contains 'my_name'; 当指定列中包含某些字符时返回该列,常用于查询包含某些特殊字符串的观测。
like: where column_name like 'A%'; 检查指定列是否满足某种格式,例子意为检查该列是否以A开头,常用于检查某一列变量是否为某种模式。
sum: select sum(column_name) as total from table_name; 使用sum函数对某一列求和。
count : select count(distinct column_name) as count from table_name; 使用count函数对某一列进行不重复计数。
HAVING语句:受GROUP BY语句的影响,对分组进行筛选,当查询中没有GROUP BY语句时,与WHERE语句作用相同,例:
proc sql;
select column_name count(*) as column2
from table_name
group by column_name
having substr(columen_name,1,1) in ('0','6');
quit;
上例即为查询column_name中以0或6开头的观测,并输出这些观测组的计数。
通过proc sql对数据集插入一条数据:
proc sql;
insert into inner1(pk,label)
values(5,'y')
;
quit;
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!