包括带有proc sql的max语句内连接

时间:2016-05-06 01:11:22

标签: sas proc-sql

我试图获取所有一系列变量,同时取消最近可能的更新日期(PD_LAST_UPDATE)昨天更新了一些字段,有些字段可能是一年前的,所以我可以&只做PD_LAST_UPDATE =(变量编码到特定时间),如果我做任何设定的时间,我会得到太多的数据。

这是我的代码

(SELECT N1.PD_PROP_NUM, N1.PD_START_DATE, N1.PD_END_DATE, N1.PD_DOW_FREQ, 
        N1.PD_RATE_PGM, N1.PD_ROOM_POOL, N1.PD_QUOTE_SERIES, 
        N1.PD_RPGM_SEQ_NUM, N1.PD_LAST_UPDATE   
        FROM OMP.OMT_PR_SSTRAT_DTL N1

     INNER JOIN OMP.OMT_PROP_SSTRAT AS N2   ON (N1.PD_PROP_NUM=N2.PS_PROP_NUM AND 
                                                N1.PD_START_DATE=N2.PS_START_DATE AND
                                                N1.PD_DOW_FREQ=N2.PS_DOW_FREQ AND
                                                N1.PD_ROOM_POOL=N2.PS_ROOM_POOL)

     WHERE N2.PS_PROP_NUM in (11612) AND **n1.PD_LAST_UPDATE = (MAX)** 
     );

  quit;

特别感兴趣的部分用粗体表示,一旦我能够弄清楚如何选择最大值以便我可以拉下所有的概率,它前面的道具将被废除。提前致谢。

1 个答案:

答案 0 :(得分:0)

您有两种方法可以过滤变量的最大值。

一种是按照您想要计算最大值的所有内容进行分组,然后使用having(这是where的分组后版本),如下所示:

proc sql;
  select origin, make, model
  from sashelp.cars
  group by origin, make
  having mpg_city = max(mpg_city);
quit;

这在SAS中是允许的,但在大多数其他SQL风格中不允许。它是下面其他方法的捷径,主要是它,它只适用于某些特定的数据结构。

更传统的方法是做一个相关的子查询:

proc sql;
  select origin, make, model
  from sashelp.cars C
  where mpg_city = (
    select max(mpg_city)
    from sashelp.cars R
    where C.origin=R.origin
      and C.make=R.make
      group by make, origin
    );
quit;

在这种情况下,我们到达同一个地方,或多或少以同样的方式到达那里 - 无论如何SAS都在后端做到这一点。

对于连接,您可以在连接之前(或在其结果随后连接的子查询中)对数据集执行此子查询或类似操作,或者您可以对连接的结果执行此操作,具体取决于哪个更有效,以及是否需要来自两个表的行来确定最大值。