《SAS编程与数据挖掘商业案例》学习笔记之十七

继续读书笔记,本次重点sas sql语句,由于sql内容多且复杂,本文只介绍商业应用中常用的并且容易出错的地方,内容包括:单表操作、多表关联、子查询以及merge和join的区别


1.单表操作

eg1

Proc sql outobs=10 *可选项,功能类似于data步中的obs数据集选项

   create table class as

Select  name,

             case when sex eq 'M' then "1" when sex eq 'F'  then "2"  else "3"

              end as sex_tran  label="sextrans",   *输出数据集中作为sex_trans的中文标签

             sum((weight-20)) as new1 format=16.2,  *sas查询特有的形式

             sum((height-10))  as new2  format=16.2,

             (calculated  new1 - calculated  new2) as new,  *calculatedsassql中特有的语句,用于对产生的新变量再操作

From sashelp.class(where=(height between 50 and 70))

Group by name,calculated sex_tran;

eg2

proc sql;

create table test1 as

select

id,

max (txn_seq) as txn_seq,

sum (amount) as sum_amt

from chap11.having1

group by id

having calculated sum_amt ge 70

;

quit;

注:having语句出现在group by后面,如果没哟group by语句,系统默认having语句和where语句效果相同

proc sql;

create table test2 as

select

id,

txn_seq,

amount

from chap11.having1

group by id

having txn_seq= max (txn_seq)

;

quit;

注:having语句和group by语句同时出现时,select后面不一定需要汇总函数如sum等,上例中,按照每一个id取最大的txn_seq

proc sql;

create table test3 as

select

id,

txn_seq,

amount

from chap11.having2

group by id

having txn_seq = max (txn_seq)

;

quit;

having语句和maxmin结合使用时,一定要注意having后面的变量在每一个id中的唯一性。

2.多表关联

左联接在join变量是一对一的情况下,如果where在表的外面,则where条件是先关联表,后筛选数据,如果where在表中,则是先筛选数据后关联表,and也是先筛选数据后关联表;因而表内写where和表外写and是完全一样的。以下程序,23完全一样,但是1和后面两个不一样

eg

proc sql;

    create table leftjoin1 as

    select

case

when b.rmb_id eq . then a.id

    else b.rmb_id

    end as all_rmb,

    a.id,

    b.rmb_id,

    b.usd_id

    from chap11.left_join_1 as a

    left join chap11.left_join_2 as b

    on a.id=b.usd_id

    where rmb_id le 4

;

quit;

proc sql;

create table leftjoin2 as

select

case

when b.rmb_id eq . then a.id

else b.rmb_id

end as all_rmb,

a.id,

b.rmb_id,

b.usd_id

from

chap11.left_join_1 as a

left join chap11.left_join_2

(where=(rmb_id le 4)) as b

on a.id=b.usd_id

;

quit;

proc sql;

create table leftjoin3 as

select

case

when b.rmb_id eq . then a.id

else b.rmb_id

end as all_rmb,

a.id,

b.rmb_id,

b.usd_id

from chap11.left_join_1 as a

left join chap11.left_join_2 as b

on a.id=b.usd_id

and rmb_id le 4

;

quit;

3.子查询

in子查询效率比join低很多,而exist子查询效率更低;

4.mergesql的比较

在“一对一”和“多对一”的情况下,效果完全相同,但是在“多对多”情况下,则完全不同。

创建测试数据集

data a1;

input x y @@;

cards;

101 1  102 3

103 30 104 5

;

run;

 

data a2;

input x y @@;

cards;

101 10 102 30

103 5  105 50

;

run;

data a3;

input x y z1 @@;

cards;

101 11 1 102 33 2

102 300 3 104 5 4

;

run;

data a4;

input x y z2 @@;

cards;

101 1 5 102 30 6

102 5 7 102 100 8

102 200 9 105 50 10

;

run;

eg1:求a1a2的交集

sql实现:

merge实现

proc sql;

select

a1.x

,a2.y

from a1 join a2

on a1.x=a2.x

;

quit;

proc sort data=a1;by x;run;

proc sort data=a2;by x;run;

data a12;

merge a1(in=ina) a2(in=inb);

by x;

if ina and inb;

proc print;run;

 注:sql是通过内连接实现,merge通过if ina and inb实现

 

eg2:用数据集a2来更新数据集a1

sql实现:

merge实现

proc sql;

select

a1.x

,case when a2.y is not null then a2.y

else a1.y end as yy

from a1

left join a2

on a1.x=a2.x

;

quit;

proc sort data=a1;by x;run;

proc sort data=a2;by x;run;

 

data a12;

merge a1(in=ina) a2(in=inb);

by x;

if ina;

proc print;run;

注:sql通过左联接方式实现,merge通过if ina方式实现,等价于左联接

 

eg3:用数据集a2来更新数据集a1,同时保留两个数据集所有观测

sql实现:

merge实现

proc sql;

select

coalesce(a1.x,a2.x) as x

,coalesce(a2.y,a1.y) as yy

from a1

full join a2

on a1.x=a2.x

;

quit;

proc sort data=a1;by x;run;

proc sort data=a2;by x;run;

 

data a12;

merge a1 a2;

by x;

      run;

proc print;run;

注:sql通过全连接方式实现,需求中需要用a2所有变量更新a1,所以一定要把a2变量放在前面,被更新的数据集放在后面,但是对join的匹配变量,对这种顺序无要求;merge没有使用in=选项,等价于全连接;

eg4:多对多

sql实现

merge实现

proc sql;

select

a3.x,a4.y

,a3.z1,a4.z2

from a3

join a4

on a3.x=a4.x

;

quit;

proc sort data=a3;by x;run;

proc sort data=a4;by x;run;

 

data a34;

merge a3(in=ina) a4(in=inb);

by x;

if ina and inb;

run;

proc print;run;

注:sql形式会出现重复值,匹配到的数据会进行笛卡尔;

merge则因为if ina and inb的作用,避免了重复

5.创建表

复制已有的表属性

proc sql;

create table a

like sashelp.class;

describe table a;

quit;

6.行操作

添加行操作

使用set语句

使用value语句

使用select语句

proc sql;

insert into countries

set name='bangladesh',

capital='dhaka',

population=126391060

set name='japan',

capital='tokyo',

population=126352003;

quit;

proc sql;

insert into countries

values ('pakistan', 'islamabad', 123060000)

values ('nigeria', 'lagos', 99062000);

quit;

proc sql;

create table newconntries

like countries;

insert into newconntries

select * from countries

where population ge 120000000;

quit;

 

最后注意:

多表关联时,最好不要超过5个表,除非都是代码表,否则sql会产生很大的临时空间,从而降低程序性能

除非必须,否则优先使用关联,而不要用子查询

在使用set操作符时,如果set表没有重复行,则使用union all会提高性能

如果有索引,尽可能用索引和where语句结合

尽量避免多对多join

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

制作一个类似苹果VFL的格式化语言来描述UIStackView

在项目中总是希望页面上各处的文字,颜色,字体大小甚至各个视图控件布局都能够在发版之后能够修改以弥补一些前期考虑不周,或者根据统计数据能够随时进行调整,当然是各个版本都能够统一变化。看到这样的要求后,第一反应…

[Android] TextView 分页功能的实现

为什么80%的码农都做不了架构师?>>> 分页功能是阅读器类软件的基本功能之一, 也是自己之前写阅读器时遇到的第一个问题. 尝试了不少办法才解决, 现在把其中最容易实现的一个方法记录下来, 也方便大家参考. 基本思路如下: 从文件中读取 8000 个字符至缓冲…

把男朋友变成儿子你只需要一秒

1 别人以为的我▼2 幸好有监控,差点就没法和老婆解释了!▼3 为了卖化妆品我已经不止一次假装我有一群舔狗了▼4 这么多年下来班主任的这些套路谁还不清楚呢?▼5 司机同志们注意啦要主动停车接受检查▼6 让男友变儿子你只需要一秒钟▼7 …

thinkphp与php共享session

在其他php页面添加如下代码即可 if (!session_id()) session_start(); 使用时 thinphp 使用 session(test,123); $user_info $_SESSION[test]; var_dump($test); //123 转载于:https://www.cnblogs.com/yun007/p/3806385.html

Android之使用HandlerThread 以及如何退出总结

1 、使用 HandlerThread handlerThread = new HandlerThread("handlerThread"); handlerThread.start(); //这里获取到HandlerThread的runloop MyHandler myHandler = new MyHandler(handlerThread.getLooper()); 2、介绍 和主线程已经没有关系了,所以不能跟新…

容器界的新“朋友”

微软中国MSDN 点击上方蓝字关注我们Ignite 2021 上,微软发布了Azure Container Apps,这是一种以无服务器应用程序为中心的托管服务,用户看不到或无需管理任何底层 VM、协调器或其他云基础架构。Azure Container Apps支持打包在容器中的任何应…

分析函数在数据分析中的应用

我们来看看下面的几个典型例子: ①查找上一年度各个销售区域排名前10的员工 ②按区域查找上一年度订单总额占区域订单总额20%以上的客户 ③查找上一年度销售最差的部门所在的区域 ④查找上一年度销售最好和最差的产品 我们看看上面的几个例子就可以感觉到这几个查询…

LateUpdate、Late、FixedUpdate的意义

1、MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用。 2、MonoBehaviour.FixedUpdate 固定更新 当MonoBehaviour启用时,其 FixedUpdate在每一帧被调用。 处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体…

JSP中一个页面怎么分清是链接过来还是提交过来的?

处理代码&#xff1a;String action request.getParameter("action");if (action ! null && action.trim().equals("post")) {}form里面的代码&#xff1a;<form action"post.jsp" method"post"> …

史上最“可怕”的数学科普,能全都看懂的只有天才!

▲ 点击查看我们在生活中&#xff0c;或许最常听到的一句话就是&#xff1a;“数学是工具”。在《数学家的眼光》一书的开篇中&#xff0c;张景中院士却举了一个颠覆我们平常认知的例子&#xff1a;大数学家陈省身有一次在北京大学的讲座中语惊四座&#xff1a;“人们常说三角形…

ubuntu环境下如何解决svn提交出现can‘t check path ‘/home/...‘

在ubuntu环境下用svn提交代码出现这个错误 cant check path /home/... 因为我们提交有限制 我一开始是这样写的 svn commit -m $ noreview [问题单号]:1234 然后报错出现了这个bug 解决办法&#xff1a; svn commit -m $ noreview [问题单号]:1234 记住了 $ 中间不能…

received packet with own address as source address

故障现象&#xff1a;网卡做bond后&#xff0c;在messages中频繁出现received packet with own address as source address。问题分析&#xff1a;该问题由于网卡做bond后上层链路交换机没有做port channel而产生错误。比如网卡做bond mode 0&#xff0c;上层交换无任何配置&am…

.NET6之MiniAPI(五):选项

选项是配置一个升级版&#xff0c;一般情况下是把一个范围内的配置包装成类型&#xff0c;以供使用&#xff0c;比如下面的RedisSetting&#xff0c;是Redis的配置参数&#xff1a;{"Logging": {"LogLevel": {"Default": "Information"…

解决nginx不支持pathinfo Thinkphp命名空间问题

1.这是我Ubuntu14.4配置文件server { listen 9989 default_server; # SSL configuration # # listen 443 ssl default_server; # listen [::]:443 ssl default_server; # # Note: You should disable gzip for SSL traffic. # See: https://bugs.debia…

Oracle常用知识总结

1.曾经不小心把开发库的数据库表全部删除&#xff0c;当时吓的要死。结果找到下面的语句恢复到了1个小时之前的数据&#xff01;很简单。 注意使用管理员登录系统&#xff1a; select * from 表名 as of timestamp sysdate-1/12 //查询两个小时前的某表数据&#xff01;既然两…

Android之项目中调用已有.so库

注意该.so库指的是android平台的&#xff0c;非一般linux、unix平台&#xff1b; 1、现有库libcom_ycan_testLib.so 2、新建android项目TestLib2 3、添加新类&#xff1a; 类名&#xff1a;testLib 包路径&#xff1a;参考现有库名&#xff0c;应为com.ycan 4、在新类中声明库的…

数组面试题--数组求和

题目描述&#xff1a;给定一个数组&#xff0c;实现函数用一行代码返回这个数组的和 思路&#xff1a;递归即可 1 #include <iostream>2 #include <queue>3 #include <climits>4 #include <algorithm>5 #include <memory.h>6 #include <stdio…

iNeuOS工业互联网操作系统,矿山动态产量计量系统和铁路车辆识别系统应用场景案例...

目 录1. 概述... 22. 平台演示... 23. 矿山动态产量计量系统... 24. 铁路车辆识别系统... 41. 概述iNeuOS工业互联网操作系统增加矿山动态产量计量和铁路车辆识别系统&#xff0c;提高矿山动态产量计量精度和完全避免产量核实误差的情况&#xff1…

85元一个万能工具箱,配齐24种螺丝刀+扳手,媲美德国工艺,家庭必备

▲ 点击查看对当代的男生来说&#xff0c;有什么技能是必须掌握的&#xff1f;自然是修理各种各样的东西啦~除了修电脑&#xff0c;还要修各种电器啊、家具啊之类的&#xff0c;讲真&#xff0c;会修理的男人都很帅&#xff01;实用性能也满分&#xff0c;相当于女孩子会做饭一…

poj1505

题意&#xff1a;给出一个数列有n个数&#xff0c;要求用分割分把这个数列分成m段&#xff0c;不能改变原数列的顺序。每段至少一个数。求使得加和最大的那段的加和最小的划分方案。如果有多组解的话先要保证第一段和尽量小&#xff0c;若仍有多组解&#xff0c;要先保证第二段…