我正在为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子句的等价物?
感谢。
答案 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中执行等效操作,您可以执行以下操作:
因此...
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
);