sql - SAS中的/这个数据语句到底在做什么? PostgreSQL 等效?

标签 sql postgresql sas

我正在将 SAS 脚本转换为适用于 PostgreSQL 环境的 Python。在一些地方,我发现了 SAS 中的数据语句,它看起来像这样(在多个脚本中):

data dups;
  set picc;
  by btn wtn resp_ji;
if not (first.resp_ji and last.resp_ji);
run;

显然,数据集在 Python 或 SQL 环境中是不一样的,我无法确定这个特定语句在做什么。需要明确的是,有许多正在转换的脚本以这种方式创建具有相同名称的数据集。所以我的预期是其中大部分会被一遍又一遍地覆盖。

我也不清楚 postgres 中相当于数据复制语句中的条件是什么。

是否有明显的 PostgreSQL 语句可以代替它?是这样的吗?:

CREATE TABLE dups AS
  SELECT btn, wtn, resp_ji
  WHERE /*some condition that matches the condition in the data statement*/

是否

by btn wtn respji;

语句意味着复制了哪些列,或者这相当于 PostgreSQL 中的 ORDER BY 子句?

谢谢。

最佳答案

该语句使用所谓的“按组处理”。在步骤运行之前,它要求数据按 btn wtn resp_ji 排序。

first.resp_ji 片段正在检查它是否是第一次在当前 btn/wtn 组合中看到 resp_ji 的当前值。同样,last.resp_ji 片段正在检查它是否是最后一次在当前 btn/wtn 组合中看到 resp_ji 的当前值。

将所有这些组合在一起的声明:

if not (first.resp_ji and last.resp_ji);

也就是说,如果当前的btn/wtn组合多次出现resp_ji的当前值则保留记录,否则丢弃记录。 if 语句的行为隐含地保留/丢弃记录。

要在 SQL 中执行等效操作,您可以执行以下操作:

  1. 找到所有要丢弃的记录。
  2. 丢弃原始数据集中的那些记录。

所以...

create table rows_to_discard as 
select btn, wtn, resp_ji, count(*) as freq
from mytable
group by btn, wtn, resp_ji
having count(*) = 1

create table want as 
select a.*
from mytable a
left join rows_to_discard b  on b.btn = a.btn
                            and b.wtn = a.wtn
                            and b.resp_ji = a.resp_ji
where b.btn is null

编辑:我应该提一下,没有简单的 SQL 等价物。通过对子查询中的行进行编号,然后在此基础上构建逻辑,这可能是可能的,但这很糟糕。它还可能取决于所使用的 SQL 的具体风格。

关于sql - SAS中的/这个数据语句到底在做什么? PostgreSQL 等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31166638/

相关文章:

mysql - 合并 2 个 Sql 结果行

PHP MySQL : Select column with title like year

performance - Scala 与 Earth Box 中基于树的算法

sorting - 在 SAS 中,有没有办法使用除一个之外的所有变量进行排序?

java - 绕过在 JPA 中使用 UNION 的查询

java - 使用 native SQL 的 Hibernate 批处理

postgresql - 如何在 GoLang 的结构数组中分配一组行(从数据库中检索)?

postgresql - 在 postgresql 中创建函数以使用首选值和别名更新表中的列值

r - 相同的回归,不同的统计数据(R v. SAS)?

performance - SAS:通过 proc 导入提高 do 循环的速度