有没有办法在SAS / SQL中做到这一点?

时间:2020-10-25 18:20:06

标签: sql sas

我有三个3个数据库表。其中之一是主表,其余用于引用。 A snapshot of the master table is below

天气和季节本身就是表格,但它们持有的唯一信息是1到4之间的整数。我需要创建一个SQL / SAS查询,该查询基本上通过天气和季节的排列来评估,即{{1} }和weather=1season=1,2,3,4weather=2

我尝试对内联查询执行此操作,但不确定我是否正确。这就是我所拥有的-

season=1,2,3,4

从该查询中获得的数据的最终结果是基本上比较天气和季节对租赁模式的影响。

3 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您基本上希望您的主表具有其他两个参考表的所有可能排列/组合。

这样做的诀窍是没有连接,而只需从表中进行选择。

以下是您的示例:

DB Fiddle Example

答案 1 :(得分:0)

交叉连接将创建排列的结果集。

您可以

  • 具有用于枚举变量允许值的外部表
  • 从正在处理的数据创建“允许”值的列表。注意:这可能会丢失可能发生 的排列,但不会发生,因为数据本身可能在所有行中都缺少某些值。

在处理具有CLASSDATA选项的过程时,交叉联接概念经常会发挥作用。

一旦有了排列,就可以在计算分组聚合时加入它。

示例:

proc sql;
  create table seasons (season num);
  create table weathers (weather num);

  insert into seasons
    values(1)
    values(2)
    values(3)
    values(4) 
  ;

  insert into weathers select season as weather from seasons;

  create table want as
  select 
    perm.weather
  , perm.season
  , mean(casual_renter) as cas_rent_mean
  from 
    (select weather, season from weathers cross join seasons) as perm
  left join 
    have
  on
    perm.weather = have.weather and
    perm.season  = have.season
  group by
    perm.weather, perm.season

答案 2 :(得分:0)

为什么要使用SQL?您可以使用PROC MEANS计算CASUAL_RENTER的平均值。如果要填写结果以便包括所有可能的季节*天气组合,请使用CLASSDATA选项。

proc means data=have nway classdata=classdata;
  class season weather;
  var casual_renter;
run;

在这种情况下,您可以通过简单的数据步骤轻松制作CLASSDATA数据集。

data classdata;
  do season=1 to 4;
    do weather=1 to 4;
      output;
    end;
  end;
run;

如果问题更加复杂,并且您需要从源数据集中进行构建,则可以通过简单的SQL查询来完成。因此,如果您具有分别具有变量SEASON和WEATHER的SEASON和WEATHER数据集,那么此代码将起作用。

proc sql;
  create classdata as select distinct season,weather from season,weather ;
quit;