我想比较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的观察进行比较,依此类推。
可以做到吗?
答案 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循环还是散列