Oracle 组合集合&x2B;表+;windowfunction一气呵成

Oracle 组合集合&x2B;表+;windowfunction一气呵成,oracle,sas,window-functions,Oracle,Sas,Window Functions,我想在proc sql中实现类似的功能: proc sql; %connect_to_sql_macro; create table sql.table as ( select some_id, date from connection to oracle ( select some_id, date, row_number()over(partition by some_id order by date) as row from dataset d join sql_table s on d.

我想在proc sql中实现类似的功能:

proc sql;
%connect_to_sql_macro;
create table sql.table as
(
select some_id, date from connection to oracle
(
select some_id, date, row_number()over(partition by some_id order by date) as row from dataset d join sql_table s on d.some_id=s.some_id 
) where row=1
基本上,我需要在oracle中基于与oracle表连接的数据集创建表,并为每个id获取第一个日期。
如果我使用“从oracle”传递,它看不到数据集,如果我使用另一种方法,我不能使用窗口函数(row_number()),因为它们不在SAS中。现在,我从该数据集创建一个表,然后进行传递,但它很大,我需要一次性完成。有什么建议吗?

您最好在SAS中执行此操作。 也可以一步完成

libname lib <oracle connection options>;
proc sql;
select some_id
            ,date
from dataset d
inner join lib.sql_table s
    on d.some_id=s.some_id
group by some_id
having date=min(date)
;
quit;

另外,尽可能限制从oracle表中读取的记录量。

正如您所说,SAS不支持窗口函数,因此使用它们的唯一方法是首先将SAS数据集上载到oracle,可能是上载到临时表。另一方面,SAS数据步骤可以通过组处理完成SQL窗口函数(以及更多)所做的事情。
proc sql;
%connect_to_sql_macro;
select some_id
            ,date
from dataset d
inner join (select * from connection to oracle (
               select * from sql_table
               )
            ) s
    on d.some_id=s.some_id
group by some_id
having date=min(date)
;
quit;