如何在滚动时间间隔内比较价格观察?

时间:2019-03-07 16:26:46

标签: sas sas-macro datastep

我想比较10分钟滚动时间内的价格观察。

假设我有一张下表,其中列出了产品的价格(最左侧的列)和销售时间:

data have;
input @1 PRICE 1. @6 PRODUCT $3. @12 DATE_TIME anydtdtm15.;
format date_time datetime17.;
datalines;
1    POW   JAN-01-17 13:00
2    POW   JAN-01-17 13:04
1    POW   JAN-01-17 13:06
2    POW   JAN-01-17 13:15
3    POW   JAN-01-17 13:20
5    POW   JAN-01-17 13:29
1    GAS   JAN-01-17 13:05
2    GAS   JAN-01-17 13:10
1    GAS   JAN-01-17 13:39
;;;;
run;

我需要的是一段代码,可以让我在10分钟内比较价格。例如:13:00的POW观察的价格为1,并且该价格观察应与15:10之前相同的所有其他价格观察进行比较。如果在此时间窗口内价格匹配,则应在表中吐出匹配的行。

对于在13:04的观察和价格2,必须再次执行此操作,然后将其与观察直到13:14的观察进行比较,依此类推。

可以做到吗?

1 个答案:

答案 0 :(得分:0)

您的解决方案是SQL自反(或自我)联接吗?

在此示例左撇子连接中,行按产品和价格进行连接以强制执行相同的价格搜索条件。通过限制接受相同价格作为比赛的时间范围,进一步加强了连接。如果没有价格相同的期货,则使用左联接。

data have;
input @1 PRICE 1. @6 PRODUCT $3. @12 DATE_TIME anydtdtm15.;
format date_time datetime17.;
datalines;
1    POW   JAN-01-17 13:00
2    POW   JAN-01-17 13:04
1    POW   JAN-01-17 13:06
2    POW   JAN-01-17 13:15
3    POW   JAN-01-17 13:20
5    POW   JAN-01-17 13:29
1    GAS   JAN-01-17 13:05
2    GAS   JAN-01-17 13:10
1    GAS   JAN-01-17 13:39
1    GAS   JAN-01-17 13:42
1    GAS   JAN-01-17 13:44
1    GAS   JAN-01-17 13:52
;;;;
run;

proc sql;
  create table want as
  select self.*
  , twin.date_time as same_priced_future_date_time
  , twin.date_time - self.date_time as delta format=time8.
  from have as self
  left join have as twin
  on self.product = twin.product
  and self.price = twin.price
  and self.date_time < twin.date_time
  and twin.date_time - self.date_time <= '00:10:00't
  order by self.product, self.date_time, twin.date_time
  ;

还有其他使用DATA步骤的方法;它是合并/滞后,DOW循环还是散列