欢迎光临散文网 会员登陆 & 注册

手把手教你医学统计-SAS 编程技巧 - PROC SQL(二)

2023-11-09 11:49 作者:水木菁创医疗器械CRO  | 我要投稿



上一节中,我们介绍了如何使用 SQL 创建、删除数据集、修改数据集结构,以及如何新增、删除和更新数据集的观测,所涉及到的内容都是对数据集的增、删、改的操作,从本节开始,我们将对 SQL 中最常见,也最灵活的查询操作进行详细的介绍。


查询语句

SQL 的查询操作是通过 SELECT 语句实现的。SELECT 语句包含很多子句,本节介绍的是最简单的查询语句。


查询一个或多个变量

↑向右滑动查看全部代码↑


上述代码使用 SELECT 语句从数据集 DM 中查询了 4 个变量, FROM 子句指定查询的源,即从哪个数据集或视图中进行查询。


查询所有变量

上述代码使用 SELECT 语句从数据集 DM 中查询了所有变量,其中 * 代表 FROM 子句指定的数据集 DM 中的所有变量,这在数据集变量名未知的情况下非常有用。

💡 不可滥用 ,当查询的数据源包含大量变量和观测时,使用 * 会造成性能的严重下降。通常来说,建议使用最小化原则,需要使用什么变量就查询什么变量,无需使用的变量不应当出现在 SELECT 语句中。


查询不重复的观测

默认情况下,SELECT 语句会查询并返回所有匹配的观测,某些变量在不同的观测上可能存在相同的值,如果我们只需要变量的值不重复的观测,可以使用 DISTINCT UNIQUE 关键字去除重复的观测,DISTINCT 与 UNIQUE 效果相同。

↑向右滑动查看全部代码↑

上述代码使用 SELECT 语句从数据集 AE 中查询所有发生了不良事件的受试者信息,由于同一受试者可能发生多次不良事件,因此使用 DISTINCT 关键字去除重复的观测,每位受试者仅保留一条观测。

💡 一条 SELECT 语句中只能有一个 DISTINCT 关键字,DISTINCT 关键字必须出现在所有变量名的前面。虽然 DISTINCT 在 SELECT 语句中看起来只对紧随其后的第一个变量生效,但事实上,它作用于 SELECT 语句中出现的所有变量(包括未命名的变量)。这意味着,只有当 SELECT 语句中的变量组合存在重复的观测时,查询结果中才会去除这些重复的观测,而并非在查询的第一个变量出现重复值的观测时就立即起作用。

💡 由于数值精度的问题,SELECT DISTINCT 查询的结果可能会出现变量的显示值完全一致的观测。


使用查询结果创建新的数据集

在上一节中,我们提到创建数据集的两种方法:

  1. 通过直接定义变量属性的方式创建数据集

  2. 使用 LIKE 关键字基于其他数据集的结构创建数据集

其实,我们也可以利用 SELECT 语句的查询结果来创建数据集。当需要对 SELECT 语句的查询结果作进一步处理时,就可以将查询结果存储为新的数据集。

↑向右滑动查看全部代码↑


上述代码使用 SELECT 语句从数据集 AE 中查询所有发生了不良事件的受试者信息,并存储在新的数据集 AE_UID 中。


限定数据集名称

前面几个例子中,我们在 SELECT 语句中仅指定了查询的变量名,而没有指定变量所在的数据集,在这种情况下,FROM 子句的返回结果将作为 SELECT 语句查询的数据源。在以后的章节中,我们会看到在某些情况下,不指定数据集名称可能会造成歧义,此时必须在 SELECT 语句中限定变量名所在的数据集名称,使用 数据集.变量名 的格式引用指定数据集中的变量。


常量

除了查询变量,SELECT 语句也可以指定常量作为查询对象,此时的查询操作其实更像是新建了一个固定值的变量。常量包括数值常量和字符串常量,有时候也被称为字面量(literal)。

↑向右滑动查看全部代码↑


上述代码中,在查询语句中使用了常量 "TEST-CLINICAL-TRIAL-2023-0012",查询结果存储在新创建的数据集 ADSL 中。ADSL 包括数据集 DM 中的 4 个变量,以及使用常量定义的一个变量 STUDYID。

💡 使用关键字 AS 可以为未命名的变量指定一个变量名(又称别名),便于后续引用。若查询结果仅仅是为了展示,可以不定义别名;若查询结果将存储在数据集中,则应当指定一个别名,否则 SAS 将自动指定一个变量名(根据查询类型,可以是 _TEMAxxx 或 _TEMGxxx)。基于代码可读性的考虑,依赖 SAS 的自动命名机制是不可取的,在创建数据集的任何时候都应当显式指定变量名。


CASE 表达式

SELECT 语句支持使用 CASE 表达式按照条件进行查询。

上述代码使用 CASE 表达式根据变量 SEX 的值衍生新的变量 SEXC,对于某一条观测,其变量 SEX 的值都会与指定的 WHEN 条件进行比较,直到符合某个 WHEN 条件,此时将 THEN 后面的结果作为查询结果赋值给变量 SEXC,若变量 SEX 的值不符合任何 WHEN 条件,则 ELSE 后面的结果将作为查询结果。

CASE 表达式还有另一种写法,可以不在 CASE 后面指定变量名,但是在 WHEN 后面指定具体的条件,上述代码可以改写为:

💡 这两种写法的区别是:第一种适用于要执行的比较仅涉及单个变量的情况,第二种适用于要执行的比较涉及多个变量的情况。

例如,下面的例子就只能使用 CASE 表达式的第二种写法:

↑向右滑动查看全部代码↑


CASE 表达式可以嵌套使用,从而实现复杂条件的判断,这类似于 DATA 步中 IF ELSE 语句的嵌套,例如:

↑向右滑动查看全部代码↑


函数

SELECT 语句中可以使用任何支持的 SAS 函数,函数的返回值将作为查询结果。PROC SQL 支持大部分 SAS 内置函数以及任何不含数组参数的 PROC FCMP 自定义函数。例如:下面的代码在 SELECT 语句中使用了 INTCK 函数计算用药的持续天数。

↑向右滑动查看全部代码↑


CALCULATED 关键字

CALCULATED 关键字用于引用当前 SELECT 子句中已经计算好的变量,使用 CALCULATED 可以减少不必要的计算过程,降低代码的冗余。

↑向右滑动查看全部代码↑

上述例子使用 CALCULATED 关键字引用了当前 SELECT 语句中经过单位转换的变量 heightweight ,直接使用经过单位转换后的结果计算 BMI,若不使用 CALCULATED 关键字,则引用的仍然是未经过单位转换的变量。如下图所示,由于使用了 CALCULATED 关键字,BMI1 才是我们想要的计算结果。

💡 在这里例子中,SELECT 语句使用了函数 MONOTONIC()  ,这是一个 SAS 9.4 尚未公开于文档中的函数,其作用是自增计数,类似于 DATA 步中的自动变量 _n_ ,这在附带观测序号输出的情况下是非常有用的。


相关文章:

手把手教你医学统计-SAS 编程技巧 - PROC SQL(一)


【文章来源】水木菁创统计部

手把手教你医学统计-SAS 编程技巧 - PROC SQL(二)的评论 (共 条)

分享到微博请遵守国家法律