2016-12-08 1 views
0

J'ai une table EG SAS qui ressemble à ceci:faire des groupes de sessions SAS EG

DateTime   User Prod Date  Date2  User2 Prod2 DateTime2   SecDiff Calc 
20MAR2014:20:17:00 54823 1430 20140320 .   .  .  .     .  1 
13MAR2014:09:07:16 66019 8244 20140313 20140320 54823 1430 20Mar14:20:17:00 -644984 1 
13MAR2014:09:07:44 66019 8244 20140313 20140313 66019 8244 13Mar14:09:07:16 28  0 
13MAR2014:09:08:17 66019 8244 20140313 20140313 66019 8244 13Mar14:09:07:44 33  0 
13MAR2014:09:08:43 66019 8244 20140313 20140313 66019 8244 13Mar14:09:08:17 26  0 
13MAR2014:09:09:12 66019 8244 20140313 20140313 66019 8244 13Mar14:09:08:43 29  0 
13MAR2014:09:10:34 66019 8244 20140313 20140313 66019 8244 13Mar14:09:09:12 82  0 
13MAR2014:09:11:08 66019 8244 20140313 20140313 66019 8244 13Mar14:09:10:34 34  0 
13MAR2014:09:11:34 66019 8244 20140313 20140313 66019 8244 13Mar14:09:11:08 26  0 
14MAR2014:21:19:18 66019 8244 20140314 20140313 66019 8244 13Mar14:09:11:34 130064 1 
14MAR2014:21:19:52 66019 8244 20140314 20140314 66019 8244 14Mar14:21:19:18 34  0 

Toutes les colonnes avec 2 est une version décalée 1 colonnes "non-2".

Ces données illustrent une activité de l'utilisateur sur un produit spécifique à un certain horodatage DateTime.

Je suis intéressé par la création de "Sessions" sur la base de certains paramètres, mais est illustré dans la dernière colonne appelée "Calc". Donc, pour chaque nouvelle session, il devrait y avoir un nouveau numéro. Les paramètres sont "Date = Date2", "Utilisateur = Utilisateur2", "Prod = Prod2" et "SecDiff < = 3600". L'objectif final est de calculer les secondes de chaque session (en ajoutant le SecDiff). Donc, dans ce cas, la table me sera donné ces résultats:

DateTime   User Prod Date  Seconds Calc 
20MAR2014:20:17:00 54823 1430 20140320 .  1 
13MAR2014:09:07:16 66019 8244 20140313 258  2 
14MAR2014:21:19:18 66019 8244 20140314 34  3 

Cela renvoie les différents en quelques secondes, mais supprime la valeur extrême qui est calculée et représente une nouvelle session.

Répondre

0

Je ne suis pas certain de comprendre cela correctement, mais pourquoi auriez-vous besoin de toutes ces colonnes? Il suffit d'utiliser les trois premiers comme ceci

data a; 
input act_time datetime20. product user; 
cards; 
20MAR2014:20:17:00 54823 1430  
13MAR2014:09:07:16 66019 8244  
13MAR2014:09:07:44 66019 8244 
13MAR2014:09:08:17 66019 8244 
13MAR2014:09:08:43 66019 8244 
13MAR2014:09:09:12 66019 8244 
13MAR2014:09:10:34 66019 8244 
13MAR2014:09:11:08 66019 8244 
13MAR2014:09:11:34 66019 8244  
14MAR2014:21:19:18 66019 8244 
14MAR2014:21:19:52 66019 8244 
; 
run; 

proc sort data=a out=b; by product user act_time; run; 

data c(drop=last_time); 
retain last_time; 
set b; 
by product user; 
if first.user then do; 
    session + 1; 
    last_time = .; 
end; 
else do; 
    if act_time >= last_time + 3600 then do; 
     session + 1; 
    end; 
end; 
last_time = act_time; 
run;  

data d; 
retain first_time; 
set c; 
by session; 
if first.session then do; 
    first_time = act_time; 
end; 
if last.session then do; 
    duration = act_time - first_time; 
    output; 
end; 
run;