首页 > 数据库 >【测试】SAS 编程技巧 - PROC SQL(一)

【测试】SAS 编程技巧 - PROC SQL(一)

时间:2023-08-03 13:12:19浏览次数:43  
标签:变量 数据 子句 视图 观测 索引 SQL SAS PROC

SQL 全称 Strucured Query Language,即结构化查询语言,广泛应用于关系型数据库中。

SAS Base 使用 PROC SQL 提供了对 SQL 的实现。PROC SQL 过程可以帮助我们完成以下任务:

  • 创建数据集、视图和索引
  • 删除数据集、视图和索引
  • 修改数据集的结构
  • 更新数据集的观测
  • 从数据集或视图中获取观测
  • 从数据集或视图中合并观测
  • 汇总统计

上述任务可以用四个字简要概括:增、删、改、查

在这一节中,我们主要介绍如何使用 SQL 创建和删除数据集、视图和索引、修改数据集的结构,以及更新、新增和删除数据集中的观测。

创建数据集

使用 CREATE TABLE 语句可以创建一个数据集。例如:下述代码创建了一个新的数据集,并定义了变量标签、输入格式、输出格式:

proc sql noprint;
    create table DM
        (USUBJID char(20) informat = $20. format = $20.     label = "受试者唯一标识符",
         SITEID  char(10) informat = $10. format = $10.     label = "中心编号",
         SEX     char(4)  informat = $4.  format = $4.      label = "性别",
         AGE     num      informat = 8.   format = 8.       label = "年龄(岁)",
         HEIGHT  num      informat = 8.2  format = 8.2      label = "身高(cm)",
         WEIGHT  num      informat = 8.2  format = 8.2      label = "体重(kg)");
quit;

该数据集名称为 DM,包含 3 个字符型变量和 3 个数值型变量。变量的定义包括变量名和变量类型,变量名可以是任何合法的 SAS 名称,变量类型可以是 CHARACTERNUMERIC,可以分别简写为 CHARNUM

运行后查看数据集 DM 属性:

img

CREATE TABLE 语句还支持基于现有数据集结构创建空白数据集,只需使用 LIKE 关键字即可:

proc sql noprint;
    create table DM1 like DM;
quit;

上述代码将会创建一个名为 DM1 的数据集,其结构与数据集 DM 完全一致,但不含任何观测。

创建视图

视图本质上是一段 PROC SQL 的查询语句,本身并不包含任何数据集中的任何数据,当在 SAS 过程或 DATA 步中使用视图时,视图包含的查询语句将会自动执行。这意味着每次访问视图时,查询到的数据都有可能是不同的,即视图是动态更新的。

当某个查询语句被频繁使用时,可以为其创建视图,以供其他查询语句访问,而无需每次访问时编写重复的查询语句。

使用 CREATE VIEW 可以创建一个视图。例如:下述代码创建了一个视图,该视图查询了数据集 DM 中年龄 ≥ 60 岁的受试者信息。

proc sql noprint;
    create view age_gt60 as
        select usubjid, siteid, sex, age from dm
            where age >= 60;
quit;

注:上述代码使用了 SELECT 语句进行数据库的查询,我们将在未来的章节中介绍它。

创建索引

索引是一种数据结构,可以将其看做书的目录,它存储了指向特定观测的指针,以便可以通过指针快速定位特定数据。使用索引可以提高 PROC SQL 在特定情况下执行查询语句的效率。

索引又分为简单索引(simple index)和复合索引(composite index)。

简单索引:在一个变量上创建,索引名称必须与变量名相同;
复合索引: 在两个或多个变量上创建,索引名称不能与数据集中的任何变量名相同。

使用 CREATE INDEX 可以创建一个索引。例如:下述代码为数据集 DM 中的受试者唯一编号建立了索引。

proc sql noprint;
    create index usubjid
        on DM(USUBJID);
quit;

复合索引适用于不存在一个用于标识唯一观测的变量的数据集中(ADLB,ADAE等),例如:

proc sql noprint;
    create index aeindex
        on adae(usubjid, aeseq);
quit;

在数据集属性信息的“索引”标签中可以查看已定义的索引信息:

img

删除数据集、视图、索引

使用 DROP 语句可以删除数据集、视图和索引。

proc sql noprint;
    drop table dm1;
    drop view age_gt60;
    drop index usubjid from dm;
quit;

删除操作需要注意以下问题:

  1. 删除数据集或视图后,所有引用了该数据集或视图的视图都将失效;
  2. 删除含有索引的数据集后,该数据集中的所有索引也将一并被删除;
  3. 删除一个复合索引后,其所关联的变量也将失去该复合索引,但会保留其他索引。

修改数据集的结构

使用 ALTER TABLE 可以修改数据集的结构,包括增加、删除变量、修改变量属性,以及对数据完整性约束(integrity constraints)的操作。

数据完整性约束涉及到较高级的概念,我们将在未来的章节中介绍它,这一节我们只介绍对变量的增加、删除和修改操作。

新增变量

使用 ADD 子句可以新增一个或多个变量,我们可以在新增变量的同时指定变量的属性。

proc sql noprint;
    alter table dm
        add BRTHDAT  num      label = "出生日期" format = yymmdd10.,
            RANDDT   num      label = "随机日期" format = yymmdd10.,
            RNUMBER  num      label = "随机号",
            ARM      char(10) label = "组别";
quit;

img

删除变量

使用 DROP 子句可以删除变量。

proc sql noprint;
    alter table dm
        drop BIRTHDAT, BMI;
quit;

注意:删除某个变量时,使用该变量定义的索引(包括简单索引和复合索引)都将一并被删除。

修改变量属性

使用 MODIFY 子句可以修改变量的属性,用法与 ADD 子句类似。

proc format;
    value $sex
        "M" = "男"
        "F" = "女";
run;

proc sql noprint;
    alter table dm
        modify RANDDT format = e8601da10.,
               SEX char(10) format = $sex.;
quit;

上述代码修改了数据集 DM 中变量 RANDDT 和 SEX 的属性,分别将它们的输出格式修改为 e8601da10.$sex.,同时将变量 SEX 的长度修改为 10。

注意:ALTER TABLE 语句无法修改变量名,如需修改这些属性,请使用 CREATE TABLE 或 SELECT 语句间接完成,这将在未来的章节中进一步介绍。

更新数据集观测

使用 UPDATE 语句可以对数据集中的观测进行更新。SET 子句指定更新的变量和数据,WHERE 子句指定筛选条件,符合条件的观测才会被更新。

proc sql noprint;
    update dm
        set BMI = HEIGHT/100/WEIGHT**2
        where RANDFL = "Y";
quit;

上述代码更新了数据集 DM 中所有已入组(RANDFL = "Y")的受试者的体重指数(BMI)。

SET 子句可以指定 SQL 表达式作为更新后的值,但该 SQL 表达式不能包含逻辑运算符。有关 SQL 表达式的内容将在未来的章节中详细介绍。

如果未指定 WHERE 子句,则会更新所有观测。

新增数据集观测

使用 INSERT 语句可以在数据集中新增观测。INTO 子句指定需新增观测的数据集名称,有两种新增观测的方式:使用 SETVALUES 子句。

使用 SET 子句允许在为变量赋值时,无需考虑变量赋值的顺序;而 VALUE 子句在为变量赋值时,赋值顺序必须与 INSERT INTO 指定的变量顺序或变量在数据集中的顺序一致。

proc sql noprint;
    insert into dm (USUBJID, SITEID, SEX, AGE)
        set SEX = "F",
            AGE = 23,
            USUBJID = "S0101",
            SITEID = "01";
    insert into dm (USUBJID, SITEID, SEX, AGE, HEIGHT, WEIGHT)
        values("S0102", "01", "M", 34, 166, 55)
        values("S0201", "02", "F", 45, 173, 65);
quit;

上述代码为数据集 DM 新增了 3 行观测,分别为 SET 子句新增的一条观测和 VALUES 子句新增的两条观测。

在新增观测时,INSERT 语句未指定但存在于数据集中的变量将会被赋予缺失值,若 INSERT 语句未指定任何变量,则相当于指定了数据集中的所有变量。例如,下述代码可以将一条完整的观测追加到数据集 DM 中。

proc sql noprint;
    insert into dm
        values("S0102", "01", "M", 34, 166, 55, "03AUG2023"d, 0102, "试验组");
quit;

删除数据集观测

使用 DELETE 语句可以对数据集中的观测进行删除。WHERE 子句指定筛选条件,符合条件的观测才会被删除。

proc sql noprint;
    delete from dm
        where RANDFL ^= "Y";
quit;

上述代码删除了数据集 DM 中所有未入组的受试者的观测。

如果未指定 WHERE 子句,则会删除所有观测。

标签:变量,数据,子句,视图,观测,索引,SQL,SAS,PROC
From: https://www.cnblogs.com/snoopy1866/p/17603052.html

相关文章

  • MySQL语句判断数据库数据重复情况,新增、删除、不变。
    判断7月8月两个月数据对比情况,新增、删除(离职)、重复。 根据manager_name,gg_name,employer,department,historical_office判断出是否重复数据--●-新增或离职--●-创建临时表CREATETABLEtemp_table(SELECTid,manager_name,gg_name,employer,department......
  • MySQL在线修改varchar列的注意事项和方法
    在数据库管理中,altertable操作是修改数据库结构的关键部分。mysql从5.6版开始提供在线操作,提供了一种在不锁定表的情况下执行这些更改的便捷方法。不过,这也有一些注意事项。在本文中,将探讨在线修改varchar列的过程,深入了解在扩大此类列的大小时获得的启发。假设有以下表定义,该表......
  • MySQL 锁机制存在的价值是什么?
    MySQL中的锁机制对于确保数据库的一致性、并发控制和事务完整性非常关键。以下是MySQL锁机制存在的主要价值:并发控制:在多用户并发访问数据库时,锁可以确保在同一时间只有一个事务能够访问同一数据,防止数据混乱和不一致。数据完整性:通过锁机制,MySQL可以确保在事务处理过程中的数据......
  • The process of
    <selectid="selectAll"resultType="Employee">SELECT*FROMemployee<where><iftest="name!=null">ANDnamelike'%${name}%'......
  • postgresql 常用的删除重复数据方法
    一、最高效方法测试环境验证,6600万行大表,删除2200万重复数据仅需3分钟deletefromdeltestawherea.ctid=any(array(selectctidfrom(selectrow_number()over(partitionbyid),ctidfromdeltest)twheret.row_number>1)); --family_no相同的数据,保留i......
  • SQL语法
    1、sql语句||的用法select(mc||xuehao)efromstudent;就是将两个字段的数据拼接在一起变成一个字段内容2、日期操作1:日期和字符转换函数(to_date,to_char)https://blog.csdn.net/m0_49273322/article/details/119006677......
  • postgresql database basis
    postgresqlbasisthesystemcatalogtablesofpsotgresqlincludethefollowingtables:pg_databases:containsinformationabout alldatabases,suchasdatabasename,owner,characterset,etcpg_tablespace: containsinformationaboutalltablespaces,suc......
  • MySQL生成UUID
    1uuid函数在MySQL中,可以用uuid()函数来生成一个UUID,如下:selectuuid()asuuid;2replace函数默认生成的uuid含有'-',我们可以使用replace函数替换掉'-',SQL如下:selectreplace(uuid(),'-','');3insert语句中使用uuid如果一个表中id字段使用uuid来作为主键,那我们可以......
  • 《Web安全基础》03. SQL 注入
    @目录1:简要SQL注入2:MySQL注入2.1:信息获取2.2:跨库攻击2.3:文件读写2.4:常见防护3:注入方法3.1:类型方法明确3.2:盲注3.3:编码3.4:二次注入3.5:DNSlog注入3.6:堆叠注入4:WAF绕过4.1:WAF简介4.2:绕过方法5:其他数据库注入5.1:Access5.2:SqlServer5.3:PostgreSQL5.4:Oracle5.5:MongoDB本系列侧......
  • MySQL常用命令
    建库CREATEDATABASE`databaseName`DEFAULTCHARACTERSETutf8COLLATEutf8_general_ci;创建用户CREATEUSER'userName'@'localhost'IDENTIFIEDBY'eKw5Ap9EBwjIRc_AO2!Y84';--userName:你将创建用户的名字--localhost:本地用户,如果想让该用户可以**从任意......