IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS Base Discussion :

Compteur user / date


Sujet :

SAS Base

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 26
    Par défaut Compteur user / date
    Bonjour,

    j'ai des données de type :

    USER DATE
    user1 11/10/2012
    user1 12/10/2012
    user1 20/10/2012
    user2 10/10/2012
    user2 11/10/2012
    user3 12/11/2012
    user3 13/11/2012
    Donc je voudrais pour finir une table comme ca :
    USER DATE COMPT
    user1 11/10/2012 1
    user1 12/10/2012 2
    user1 20/10/2012 3
    user2 10/10/2012 1
    user2 11/10/2012 2
    user3 12/11/2012 1
    user3 13/11/2012 2
    Une date apparait une seule fois par user mais plusieurs users peut avoir la meme date. donc je veux un compteur pour m'indiquer le nombre de fois qu'un useur apparait.

  2. #2
    Membre émérite
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Par défaut
    Bonjour,

    Si ce n'est pas déjà fait ... trier les données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc sort data=matable;
    by user date;
    run;
    puis utiliser le "first." dans une étape data :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    data matable;
    set matable;
    by user;
    if first.user then compteur=1;
    else compteur+1;
    run;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 26
    Par défaut
    merci bien c'est ce que je voulais.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 26
    Par défaut
    finalement il me manque quelque chose dans ma table :
    voici ma table :

    USER DATE COMPT
    user1 11/10/2012 1
    user1 12/10/2012 2
    user1 20/10/2012 3
    et voici la table que je veux :
    USER DATE COMPT
    user1 09/10/2012 0
    user1 10/10/2012 0
    user1 11/10/2012 1
    user1 12/10/2012 2
    user1 13/10/2012 2
    user1 14/10/2012 2
    user1 15/10/2012 2
    user1 16/10/2012 2
    user1 17/10/2012 2
    user1 18/10/2012 2
    user1 19/10/2012 2
    user1 20/10/2012 3
    user1 21/10/2012 3
    user1 22/10/2012 3

  5. #5
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Par défaut
    je regarderai du côté de la proc FREQ et de son option SPARSE

  6. #6
    Membre Expert
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Par défaut
    Bonsoir,

    je ne suis pas persuadé de l'intérêt pratique d'avoir la deuxième table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    USER DATE COMPT
    user1 09/10/2012 0
    user1 10/10/2012 0
    user1 11/10/2012 1
    user1 12/10/2012 2
    user1 13/10/2012 2
    user1 14/10/2012 2
    user1 15/10/2012 2
    user1 16/10/2012 2
    user1 17/10/2012 2
    user1 18/10/2012 2
    user1 19/10/2012 2
    user1 20/10/2012 3
    user1 21/10/2012 3
    user1 22/10/2012 3
    lorsqu'on a déjà la première....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    USER DATE COMPT
    user1 11/10/2012 1
    user1 12/10/2012 2
    user1 20/10/2012 3

    Enfin si la deuxième t'es vraiment indispensable...
    Je commencerais d'abord par la définition de la période,
    qui semble indépendante de l'USER ? (à confirmer)

    Ensuite après les étapes DATA/SET je ferais
    BY USER; pour traiter USER par USER

    ensuite je ferais un RETAIN pour sauvegarder des variables de contrôle à cheval sur les observations

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RETAIN COMPTEUR DATE2 DATE_COURANTE USER2;
    je sauvegarderais la valeur de l'observation pour les variables COMPT et DATE dans les variables COMPTEUR et DATE2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    COMPTEUR=COMPT ; 
    DATE2=DATE;
    A la première ligne de chaque USER j'initialiserais à la valeur de début de période la variable DATE_COURANTE et USER2 par la valeur de USER

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF first.user THEN DO;DATE_COURANTE='09OCT2012'd;USER2=USER;END;
    J'initialiserais une boucle de DATE_COURANTE à la fin de la période

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DO I=DATE_COURANTE TO '22OCT2012'd ;
    si la valeur de la boucle est celle de l'observation

    alors je met la valeur de COMPT à la celle de la variable COMPTEUR et la DATE à celle de DATE2 et j'imprime

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    THEN DO;
     COMPT=COMPTEUR;
     DATE=DATE2;
     OUTPUT;
    avant la fin de la boucle je teste si ce n'est pas la dernière ligne de l'USER, et dans ce cas je place la date courante DATE_COURANTE à la valeur DATE+1 et termine la boucle en donnant celle de la date de fin à la variable de boucle I
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF not last.user then DO; I='22OCT2012'd;DATE_COURANTE=DATE+1;END;
    sinon j'ajoute 1 à la variable compteur et je laisse la boucle se terminer pour remplir les lignes après la dernière observation de l'USER.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    else compteur=compteur+1;
    et je referme la branche

    sinon (cf condition du premier IF) je place la valeur COMPTEUR-1 dans COMPT et la date de la boucle dans DATE et j'imprime, ceci pour remplir les trous entre les lignes de l'USER y compris avant la première et la date de début de la période.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ELSE DO;
     COMPT=COMPTEUR-1;
     DATE=I;
     OUTPUT;
           END;
    et je ferme la boucle

    on fait le drop nécessaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DROP COMPTEUR DATE2 DATE_COURANTE USER2 I;
    et je termine le tout par un RUN ....


    ce qui fait le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    DATA b;
    SET a ; 
    BY USER;
    RETAIN COMPTEUR DATE2 DATE_COURANTE USER2;
     
    COMPTEUR=COMPT ; 
    DATE2=DATE; 
     
    IF first.user THEN DO;DATE_COURANTE='09OCT2012'd;USER2=USER;END;
     
    DO I=DATE_COURANTE TO '22OCT2012'd ;
     
    IF I=DATE2
    THEN DO;
     COMPT=COMPTEUR;
     DATE=DATE2;
     OUTPUT;
    IF not last.user then DO; I='22OCT2012'd;DATE_COURANTE=DATE+1;END;
    else compteur=compteur+1;
             END;
     
    ELSE DO;
     COMPT=COMPTEUR-1;
     DATE=I;
     OUTPUT;
           END;
    END;
    format date: ddmmyy10. ; 
    DROP COMPTEUR DATE2 DATE_COURANTE USER2 I;
    RUN;


    biensur si tu veux garder d'autres variables c'est + compliqué et
    il faut que tes périodes de références des USER soit les même (et que tu la complète toi même dans le code)

    Peut-être n'est ce qu'une étape que tu cherchais à faire, peut-être pourrions nous te conseiller mieux si tu nous expliquais quel était l'intérêt du bout de code initial demandé dans le code plus vaste que tu écris...

    Bon courage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. compteur user contrôle
    Par djouk dans le forum VB.NET
    Réponses: 0
    Dernier message: 27/06/2010, 00h25
  2. Compteur de dates identiques
    Par ncls1983 dans le forum Excel
    Réponses: 6
    Dernier message: 06/06/2007, 14h54
  3. Réponses: 1
    Dernier message: 16/06/2006, 15h40
  4. Réponses: 1
    Dernier message: 19/03/2006, 22h22
  5. conversion date/compteur
    Par Papagei dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/09/2005, 12h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo