изберете всяко първо появяване на стойността на колоната за определен период от време

Имам данни, както е показано по-долу.

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, но не се получи. Опитвам се по този начин да изберете *,min(dt) над (дял по net_type),max(dt) над (дял по net_type) от sandbox.santhosh   -  person santhosh kulkarni    schedule 20.08.2017
comment
изберете *, случай, когато net_type ‹› coalesce(lag(net_type, 1) OVER (дял по sub_no ORDER BY dt),99) тогава dt завършва като начало, случай, когато net_type ‹› coalesce(lag(net_type, 1) OVER (дял от 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