SAS中的/ this数据语句究竟是什么? PostgreSQL相当于?

时间:2015-07-01 16:15:32

标签: sql postgresql sas

我正在为PostgreSQL环境将SAS脚本转换为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子句的等价物?

感谢。

3 个答案:

答案 0 :(得分:4)

该声明正在使用“按群组处理'”的名称。在步骤可以运行之前,它要求数据按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. 丢弃原始数据集中的记录。
  3. 因此...

    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的特定风格。

答案 1 :(得分:1)

作为在postgressql之前学习SAS的人,我发现以下更类似于SAS。持续。逻辑:

- 第一

select distinct on (resp_ji) from <table> order by resp_ji 

- 最后

select distinct on (resp_ji) from <table> order by resp_ji desc 

答案 2 :(得分:0)

检测重复项的方法(当没有额外的区分字段可用时)是使用ctid作为决胜局:

CREATE TABLE dups
AS
SELECT * FROM pics p
WHERE EXISTS ( SELECT * FROM pics x
   WHERE x.btn = p.btn
     AND x.wtn = p.wtn
     AND x.resp_ji = p.resp_ji
     AND x.ctid <> p.ctid
     );