Как сравнить ценовые наблюдения в скользящих временных интервалах? - PullRequest
0 голосов
/ 07 марта 2019

Я хотел бы сравнить наблюдения за ценами в скользящем временном окне в 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 имеет цену 1, и это наблюдение за ценами следует сравнивать со всеми другими наблюдениями за ценами до 15:10, которые относятся к одному и тому же продукту.Если в этом временном окне есть совпадение по цене, соответствующие строки должны быть показаны в таблице.

Это снова должно быть сделано для наблюдения в 13:04 и цены 2, которую затем следует сравнить с наблюдениями до 13:14 и т. Д.

Может ли это бытьсделано?

1 Ответ

0 голосов
/ 07 марта 2019

Было ли ваше решение рефлексивным (или самостоятельным) соединением 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 или хэш

...