Как можно посчитать строки по двум группам в соответствии с временным фильтром? - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь посчитать объем продаж моих продуктов по каждому клиенту в зависимости от времени транзакции.Чтобы проиллюстрировать это, у клиента есть три типа продукта, например компьютер, принтер и клавиатура, и я хочу поставить счетчик, показывающий порядок этой продажи за последние 12 месяцев, если этот товар не помечен как 1 (у меня также есть флаг, еслипродается с кампанией или нет).Вот как выглядят мои данные:

ID  PRODUCT   SALETIME CAMPAIGN_FLAG
100 Keyboard    201705             0
100 printer     201708             1
100 computer    201801             0
100 keyboard    201806             0
200 printer     201801             1
200 keyboard    201805             0 
200 computer    201808             0

Что бы я хотел получить;

ID  PRODUCT  SALETIME CAMPAIGN_FLAG COUNT
100 Keyboard   201705             0     1
100 printer    201708             1     1
100 computer   201801             0     2
100 keyboard   201806             0     2
200 printer    201801             1     0
200 keyboard   201805             0     1
200 computer   201808             0     2

Я пробовал много вещей, например, оставляя соединение таблицы с одной и той же таблицей только с продажами, имеющими флаг campaing = 0 (я перенес только столбец SALETIME справа).Затем попытался добавить столбец за 1 год до начала продажи и установить флаг, если продажа происходит между 1 годом ранее и сейчас, с именем Count_sum.Затем я взял сумму Count_sum, сгруппированную по id, product, SALETIME.Это действительно сработало, но я не смог бы справиться, если бы у клиента было два продукта в одном месяце, в этом случае я теряю счетчик.Например:

ID  PRODUCT  SALETIME CAMPAIGN_FLAG COUNT
100 Keyboard   201705             0     1
100 printer    201708             1     1
100 computer   201801             0     3
100 keyboard   201801             0     3
200 printer    201801             1     0
200 keyboard   201805             0     2
200 computer   201805             0     2

Я не мог понять, как это исправить.Я буду благодарен, если вы могли бы помочь.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Если я вас правильно понял, то, что вы ищете, находится внутри каждого идентификатора, который вы хотите пронумеровать только для первого экземпляра определенного продукта.

пожалуйста, не указывайте Клавиатуру и клавиатуру в ваших данных или в ваших данных, это может вызвать проблемы, если у вас есть данные в одинаковой форме, и вам нужно сделать это в одном значении, как клавиатуру или Клавиатуру, а не как

сначала создать набор данных

  data have;
 input ID  PRODUCT $   SALETIME CAMPAIGN_FLAG;
 datalines;
100 keyboard    201705             0
100 printer     201708             1
100 computer    201801             0
100 keyboard    201806             0
200 printer     201801             1
200 keyboard    201805             0 
200 computer    201808             0
;

Затем сортируйте данные по идентификатору и продукту, это использует логику на следующих шагах, чтобы вы не учитывали один и тот же продукт снова с тем же идентификатором.

 proc sort data=have out=have1 ;
 by id  product;
 run;


   data have2;
    set have1 ;
   by id product;
  if first.product then num = 0;
  else num=1;
  run;

/ * затем сортируйте их обратно в данных как есть, используя id с saletime * /

proc sort data=have2 out=have3;
 by id SALETIME;
   run;

наконец примените логику

 data want(drop =num);
  set have3;
  by id;
  if first.id then count=0;
  if CAMPAIGN_FLAG = 0 and num = 0
   then count+1;
  run;

proc print data = want; бежать;

enter image description here

0 голосов
/ 18 января 2019

Вы, по сути, группируете по SALETIME и ID, например,

SELECT *, COUNT(*) AS COUNT FROM TABLE GROUP BY ID, SALETIME ORDER BY ID

Однако результат не будет таким же, так как я не могу определить критерии, просто посмотрев на ваши данные; -)

...