выбрать каждое первое вхождение значения столбца за определенный период времени

У меня есть данные, как показано ниже.

MSISDN  DATE    NET_TYPE
11111   01/01/2017  1
11111   02/01/2017  1
11111   03/01/2017  1
11111   04/01/2017  2
11111   05/01/2017  2
11111   06/01/2017  2
11111   07/01/2017  2
11111   08/01/2017  2
11111   09/01/2017  1
11111   10/01/2017  1
11111   11/01/2017  1
11111   12/01/2017  1
11111   13/01/2017  1
11111   14/01/2017  2
11111   15/01/2017  2
11111   16/01/2017  2

Я ищу решение, в котором я создаю новую переменную, которая помогает выбрать каждое первое и последнее появление NET_TYPE за определенный период времени (значения даты не фиксированы, NET_TYPE может быть 1 или 2 в течение дней или месяцев или лет). Решение я смотрю, как показано ниже.

MSISDN  DATE    NET_TYPE    INDICATOR
11111   01/01/2017  1   1
11111   02/01/2017  1   0
11111   03/01/2017  1   1
11111   04/01/2017  2   1
11111   05/01/2017  2   0
11111   06/01/2017  2   0
11111   07/01/2017  2   0
11111   08/01/2017  2   1
11111   09/01/2017  1   1
11111   10/01/2017  1   0
11111   11/01/2017  1   0
11111   12/01/2017  1   0
11111   13/01/2017  1   1
11111   14/01/2017  2   1
11111   15/01/2017  2   0
11111   16/01/2017  2   1

если вы можете предоставить решение, SAS очень полезен.

Код, который я уже пробовал, не работает в SAS:

SELECT *, 
       CASE 
         WHEN net_type <> COALESCE(Lag(net_type, 1) 
                                     OVER ( 
                                       partition BY sub_no 
                                       ORDER BY dt), 99) THEN dt 
       END AS starting, 
       CASE 
         WHEN net_type <> COALESCE(Lag(net_type, 1) 
                                     OVER ( 
                                       partition BY sub_no 
                                       ORDER BY dt DESC), 99) THEN dt 
       END AS ending 
FROM   table 
ORDER  BY dt 

sas
person santhosh kulkarni    schedule 20.08.2017    source источник
comment
StackOverflow создан, чтобы помочь программистам с их кодом. Мы не пишем решения по вашему ТЗ. Если у вас есть код, который вы пробовали до сих пор, мы можем помочь.   -  person Assafs    schedule 20.08.2017
comment
Мне не нужно полное решение, можно было бы обойти подсказку. Я пробовал с первого. и последнее. переменная с использованием proc sort, но не получилось. Я пытаюсь следующим образом выбрать *, min (dt) over (раздел по net_type), max (dt) over (раздел по net_type) из sandbox.santhosh   -  person santhosh kulkarni    schedule 20.08.2017
comment
выберите *, случай, когда net_type ‹› объединить (lag (net_type, 1) OVER (разделить по под_номеру ORDER BY dt), 99), затем dt закончить как начальный, случай, когда net_type ‹› объединить (lag (net_type, 1) OVER (раздел by sub_no ORDER BY dt desc),99) затем dt end как заканчивающийся из таблицы order by dt Я пробовал, но это работает только в db, но не в sas   -  person santhosh kulkarni    schedule 20.08.2017
comment
Я не думаю, что SAS поддерживает секционирование и работу с окнами в операторах SQL.   -  person david25272    schedule 21.08.2017


Ответы (1)


В SAS это очень просто сделать, если вы достаточно знаете о пошаговой обработке данных, и очень трудно сделать, если вы этого не сделаете. Как вы обнаружили, proc sql не поддерживает используемый вами синтаксис partition by. Вот решение шага данных:

data have;
input MSISDN & DATE & ddmmyy10. NET_TYPE;
format DATE ddmmyy10.;
cards;
11111   01/01/2017  1
11111   02/01/2017  1
11111   03/01/2017  1
11111   04/01/2017  2
11111   05/01/2017  2
11111   06/01/2017  2
11111   07/01/2017  2
11111   08/01/2017  2
11111   09/01/2017  1
11111   10/01/2017  1
11111   11/01/2017  1
11111   12/01/2017  1
11111   13/01/2017  1
11111   14/01/2017  2
11111   15/01/2017  2
11111   16/01/2017  2
;
run;

data want;
  set have;
  by notsorted MSISDN NET_TYPE;
  INDICATOR = first.NET_TYPE or LAST.NET_TYPE;
  put (_all_) (=);
run;

Когда у вас есть оператор by на шаге данных, он создает временные переменные first.x и last.x для каждой переменной в вашем операторе by, автоматически просматривая следующую строку во входном наборе данных.

Обычно оператор by требует, чтобы ваш набор данных был отсортирован, но параметр notsorted отменяет это и позволяет вам идентифицировать любые строки, в которых переменная изменяется с одного значения на другое, независимо от порядка.

person user667489    schedule 20.08.2017
comment
Я думаю, что либо SO, либо ваш редактор заменил вкладки пробелами в операторе карт, и данные не читаются правильно. Если вы замените несколько пробелов, он отлично работает. - person david25272; 21.08.2017
comment
@ david25272 - исправлено - person user667489; 21.08.2017