楼主: pinggutu
19013 12

[原创博文] Data Step 和 Proc SQL 的区别 [推广有奖]

  • 0关注
  • 1粉丝

大专生

81%

还不是VIP/贵宾

-

威望
0
论坛币
147 个
通用积分
0.9000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
995 点
帖子
51
精华
0
在线时间
77 小时
注册时间
2010-4-13
最后登录
2022-10-13

楼主
pinggutu 发表于 2010-4-28 02:14:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
大家可以给总结一下Data Step 和 Proc SQL两者的区别吗?例如各自的优缺点,在什么条件下只能用某一种等等。谢谢了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Data step proc sql Data Step ROC 优缺点

回帖推荐

yatming 发表于10楼  查看完整内容

proc sql的表连接并不是都用到索引,尤其是小表超过大表的某个界定值时,sql便不会采用索引连接。proc sql的连接方式有多种,不同连接方式也各有优缺点。data步和sql孰快孰慢,是需要分多种情况讨论的,并且还需依赖环境的影响,比如内存,IO上的限制与消耗,例如内存允许的话,hash object对待相同等级表之间的连接并不悲观。再者,data merge连接,对待源表为物理排序和源表非物理排序但有建立索引的两种情况下,效率上也会有相当 ...

本帖被以下文库推荐

沙发
lijunjie555 发表于 2010-4-28 08:16:12
来源:http://blog.sina.com.cn/s/blog_5d3b177c0100c6tv.html?retcode=0

DATA Step与PROC SQL的对比

DATA Step vs. PROC SQL: What’s a neophyte to do? -

原文地址:http://www2.sas.com/proceedings/forum2007/237-2007.pdf

转载请注明出处:http://blog.sina.com.cn/s/blog_5d3b177c0100c6tv.html

这篇文章比较简单,因此只是把一些SAS和SQL相似的功能列举出来,供以后查阅。



1 创建数据集

1.1 从非关系数据库的数据源创建新数据集

数据步data step:

DATA table1;

    INPUT charvar1     $3.

       +1 charvar2     $1.

       +1 numvar1

       +1 numvar2   DATE7.

          ;

DATALINES;

me1 F 35786 10oct50

me3 M 57963 25jun49

fg6 M 25754 17jun47

fg7 F . 17aug53

PROC PRINT DATA=table1;

RUN;



SQL语句:PROC SQL

PROC SQL;

    CREATE TABLE table1

       (  charvar1 CHAR(3)

        , charvar2 CHAR(1)

        , numvar1  NUM

        , numvar2  NUM INFORMAT=DATE7.)

    ;

    INSERT INTO table1

       VALUES('me1','F',35786,'10oct50'd,)

       VALUES('me3','M',57963,'25jun49'd)

       VALUES('fg6','M',25754'17jun47'd)

       VALUES('fg7','F',.,'17aug53'd)

    ;

    SELECT *

        FROM table1;

QUIT;



1.2 从关系数据库的数据源创建新数据集

数据步data step:

LIBNAME olib ORACLE

      SAS/ACCESS-engine-connection-options

   ;

DATA table1;

    SET olib.oracle_table;

    IF var1 = "value1" THEN...

...



SQL语句:PROC SQL

PROC SQL;

    CONNECT TO rdbms

            AS dbref (dbms-definitions);

    CREATE TABLE table3 AS

    SELECT col1, col2, col3

       FROM CONNECTION TO dbref

         (SELECT col1, col2, col3

             FROM table1, table2

             WHERE table1.co11

                 = table2.col5

             ORDER BY col1

         );

    DISCONNECT FROM dbref;

QUIT;



2 排序数据

SAS过程步排序:

PROC SORT DATA=table1

           OUT=table2

          NODUPLICATES;

    BY var1 var2;



SQL语句:PROC SQL

PROC SQL;

    CREATE TABLE table2 AS

    SELECT DISTINCT *

      FROM table1

     ORDER BY var1 var2;

QUIT;



3 连接数据

3.1 数据集基础连接

SAS数据步:

DATA table3;

    SET table1

        table2;



SQL语句:PROC SQL

PROC SQL;

   CREATE TABLE table3 AS

      SELECT *

         FROM table1

      OUTER UNION CORRESPONDING

      SELECT *

         FROM table2;

QUIT;



3.2 匹配合并

数据步DATA Step:

DATA table3;

    MERGE table1 (IN=l)

          Table2 (IN=r);

    BY keyvar;

    IF l AND r;        



SQL语句:PROC SQL

PROC SQL;

    CREATE TABLE table3 AS

    SELECT *

      FROM      table1 AS l

     INNER JOIN table2 AS r

        ON l.keyvar=r.keyvar;

QUIT;



4 取子集

4.1 行数据子集

数据步DATA Step:

DATA table2;

    SET table1(WHERE=(var1=value1));



DATA table4;

    SET table3

    IF var1=value1 AND

       var2 IN (value-list);



DATA table7;

    MERGE table5 table6;

    BY var1;

    IF M0D(var4,3) NE 0 THEN DELETE;



SQL语句:PROC SQL

PROC SQL;

    CREATE TABLE table3 AS

    SELECT var1, var2, var3, var4

      FROM table1 AS a,

           table2 AS b

     WHERE a.var1=b.var1

       AND a.var1 IN (value-list);

QUIT;



PROC SQL;

   CREATE TABLE table4 AS

   SELECT *

     FROM table3;

   DELETE

     FROM table4

    WHERE var1 IS MISSING;

QUIT;



4.2 列数据子集

数据步DATA Step:

DATA table2;

    SET table1(DROP=var4-var6);



DATA table4;

    MERGE table2 table3;

    BY keyvar;

    KEEP keyvar var1 var2;



SQL语句:PROC SQL

PROC SQL;

    CREATE TABLE table1 AS

    SELECT var1, var2, var3, var6

      FROM table2;

QUIT;



PROC SQL;

    CREATE TABLE table2(DROP=var4-var6) AS

    SELECT *

      FROM table1;

QUIT;



5 转换数据

5.1 创建新变量

数据步DATA Step:

DATA table2;

    SET table1;

    newvar1 = oldvar2 / oldvar3;

    newvar2 = SUBSTR(charvar5,3,5);



SQL语句:PROC SQL

PROC SQL;

    CREATE TABLE table2 AS

       SELECT var1, var2,

              oldvar2/oldvar3 AS newvar1

       FROM table1;

QUIT;



5.2 汇总数据

SAS过程步:

PROC SORT DATA=table1;

  BY catvar1;



PROC MEANS DATA=table1;

    BY catvar1;

    VAR var4;

    OUTPUT OUT=table2

           SUM=totvar4

             N=cntvar4

         NMISS=missvar4    ;



SQL语句:PROC SQL

PROC SQL;

    CREATE TABLE table2 AS

        SELECT catvar1,

               SUM(var4) AS totvar4,

               COUNT(var4) AS cntvar4,

               NMISS(var4) AS missvar4

        FROM table1

        GROUP BY catvar1

        ORDER BY catvar1

    ;

QUIT;



6 数据步与SQL功能对比





7 数据步与SQL优势对比

SQL语句:PROC SQL

PROC SQL包含了很多SAS数据步和过程步的功能

一般实现的语句不会太复杂或太长

对于小的数据表,SQL更有效

SQL是标准化的数据库操作语言,因此基础使用人群更多

并不需要显性地去排序数据集

SQL的join的时候,并不要求变量相同,但长度和类型要求相同

SQL可以直接打印数据集结果,但是可以用noprint禁止打印

可以对数据集用别名



SAS:

用处理更多的数据集

可以同时对文件读取与写入数据

数据处理更灵活

更方便地使用关系数据库的数据

更容易地输入非关系数据库的外部数据



8 技术的选择

熟练或熟悉程度:

准确性:

可维护性:

人力资源的有效性:

处理资源的有效性:

将来的应用:
已有 3 人评分经验 学术水平 热心指数 收起 理由
踩云飞 + 1 + 1 精彩帖子
soporaeternus + 1 十分感谢
crackman + 20 + 1 谢谢

总评分: 经验 + 20  学术水平 + 1  热心指数 + 3   查看全部评分

藤椅
pinggutu 发表于 2010-4-28 10:08:07
太感谢lijunjie555 的精彩回复了!正是我想要的答案!我得把你说的那么多仔细研究一下。谢谢!

板凳
crackman 发表于 2010-4-28 11:17:38
谢谢 呵呵

报纸
醉_清风 发表于 2010-4-28 13:09:12
不错 辛苦2楼得同志了
从来不需要想起 永远也不会忘记

地板
yhchenxy 发表于 2010-4-28 21:44:25
太谢谢2楼了!

7
pestation 发表于 2010-4-30 01:09:16
我的经验是,在同样大的数据集情况下,DATA步要比SQL效率高,但是SQL可读更好,哈哈

8
soporaeternus 发表于 2010-4-30 09:21:03
7# pestation
SQL比DATA步慢?
这个问题值得讨论下
Let them be hard, but never unjust

9
paladin112 发表于 2010-4-30 09:49:19
在主键非唯一的数据集合并中,SQL和data处理的结果会有不同;
SQL步处理大数据集很依赖索引,如果有索引的话,像表连接、查询这样的操作会比data步快很多。

10
yatming 发表于 2010-4-30 10:30:34
proc sql的表连接并不是都用到索引,尤其是小表超过大表的某个界定值时,sql便不会采用索引连接。proc sql的连接方式有多种,不同连接方式也各有优缺点。data步和sql孰快孰慢,是需要分多种情况讨论的,并且还需依赖环境的影响,比如内存,IO上的限制与消耗,例如内存允许的话,hash object对待相同等级表之间的连接并不悲观。再者,data merge连接,对待源表为物理排序和源表非物理排序但有建立索引的两种情况下,效率上也会有相当大的差异。所以个人认为,具体讨论孰快孰慢是需要非常了解影响效率的因素,且对其统一后再进行测试评价。曾做效率测试时,由于经验不足对某一结果百思不得其解,后来才发现竟犯下忽略了本地存储和网络存储上IO读写速度差异上的低级错误。呵呵。
已有 2 人评分论坛币 学术水平 热心指数 收起 理由
crackman + 100 + 1 + 1
soporaeternus + 1 + 1 很好

总评分: 论坛币 + 100  学术水平 + 2  热心指数 + 2   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 04:59