我正在将 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 中执行等效操作,您可以执行以下操作:
- 找到所有要丢弃的记录。
- 丢弃原始数据集中的那些记录。
所以...
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/