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 :

Boucle sur deux tables dans étape Data [DATA]


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Boucle sur deux tables dans étape Data
    Bonjour,

    Je débute en programation SAS et je me heurte déjà à un soucis. Je cherches à determiner le nombre de d'appel reçu en parallèle sur une minute.
    Pour cela je me suis créé un table Nb_Ap_Int avec les creneaux de 1 minutes sur une journée et nb_appel initialisé à 0.

    Hi.........................Hs......................Nb_appel
    16MAR12:00:00:00 16MAR12:00:00:59 0
    16MAR12:00:01:00 16MAR12:00:01:59 0
    16MAR12:00:02:00 16MAR12:00:02:59 0
    16MAR12:00:03:00 16MAR12:00:03:59 0
    16MAR12:00:04:00 16MAR12:00:04:59 0
    16MAR12:00:05:00 16MAR12:00:05:59 0
    16MAR12:00:06:00 16MAR12:00:06:59 0
    (...)

    la table donnant les détail des appel est APPEL_T avec entre autre une Hdebut et Hfin des appel :

    Hdebut.................Hfin
    16MAR12:07:39:02 16MAR12:07:42:20
    16MAR12:07:38:31 16MAR12:07:38:36
    16MAR12:07:38:42 16MAR12:07:38:49
    16MAR12:07:30:33 16MAR12:07:37:51
    16MAR12:07:37:51 16MAR12:07:37:52
    16MAR12:07:37:52 16MAR12:07:37:53
    16MAR12:07:37:53 16MAR12:07:38:06
    16MAR12:07:38:06 16MAR12:07:38:26
    (...)


    Je veux remplir Nb_Ap_Int avec le nombre de traitement qui tournent pendant la minute testée. En SQL ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    proc sql;
    UPDATE Nb_Ap_Int 
    SET Nb_appel = (SELECT count(*) 
    FROM APPEL_T 
    WHERE APPEL_T.Hdebut < Nb_Ap_Int.Hs and APPEL_T.Hfin> Nb_Ap_Int.Hi);
    quit;
    Sauf qu'il faut que je l'écrive en Etape data et je sais pas du tout comment modifier une table en lisant une autre ...
    L'idée c'est de lire chaque ligne de APPEL_T et de mettre nb_appel = nb_appel +1 à tous les intervals pendant lequel l'appel dure.

    Merci de votre aide ! Et bonne journée

  2. #2
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 372
    Points
    372
    Par défaut
    Voilà comment j'envisagerais de résoudre le problème: Plutôt que de partir de la minute et de compter les appels, on part de l'appel et on en extrait les minutes occupées par la durée de l'appel. Ensuite, il n'y a plus qu'à compter chaque minute par une procédure SQL ou une étape data. Et enfin boucher les trous par les minutes vides (facile).



    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    data appels;
    informat Hdebut Hfin datetime16.;
    format Hdebut Hfin  datetime16.   ;
    input Hdebut $ Hfin $;
    cards;
    16MAR12:07:39:02 16MAR12:07:42:20
    16MAR12:07:38:31 16MAR12:07:38:36
    16MAR12:07:38:42 16MAR12:07:38:49
    16MAR12:07:30:33 16MAR12:07:37:51
    16MAR12:07:37:51 16MAR12:07:37:52
    16MAR12:07:37:52 16MAR12:07:37:53
    16MAR12:07:37:53 16MAR12:07:38:06
    16MAR12:07:38:06 16MAR12:07:38:26
    ;
    run;
     
    data comptage;
    format minutes datetime16.;
    set appels;
    /* determination de la minute du début de l'appel  */
    minutes= input(cats(put(Hdebut ,  datetime13.), ':00'), datetime16.) ;
     
    /* on compte 1 appel pour cette minute (facultatif)  */
    n=1;
     
     
    /* incrementation du temps minute par minute jusqu'à la fin de l'appel */
    do while (minutes <= Hfin);
    	output; /* on extrait chaque minute de la duree de l'appel */
    	minutes=minutes+60; /* incrementation */
    end;
     
    run;
     
     
    /* on somme les appels (les 1) par minute */
    proc sql;
    	select minutes, sum(n) as nb_appel from comptage
    	group by minutes;
    run;

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Merci de la réponse je vais tester ça ce soir. Je n'avais pas du tout songé à cette solution

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Citation Envoyé par Babzoo Voir le message
    il faut que je l'écrive en Etape data et je sais pas du tout comment modifier une table en lisant une autre .
    Voici une solution pour ta requête en étape data :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    data compar (keep=Hi Hs Nb_appel) ;
    set Nb_Ap_Int  ;
    j=0 ;
    do i=1 to nbs;
    j+1 ;
    set APPEL_T nobs=nbs point=i ;	
    if Hdebut < Hs AND Hfin> Hi then Nb_appel=Nb_appel+1 ;
    if j=nbs then output ;
    end;
    run;
    Bon courage
    Ward

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Vos deux solutions fonctionnent parfaitement, donc merci beaucoup !
    Bonne journée

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

Discussions similaires

  1. Enregister des données sur deux tables dans une base Access
    Par aziz-be dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 23/09/2012, 11h46
  2. liaison deux tables dans une boucle
    Par crazylia dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/04/2010, 11h55
  3. Appel à macro dans étape data pour modifier table
    Par Filippo dans le forum Macro
    Réponses: 2
    Dernier message: 14/10/2009, 09h00
  4. [Access] Fonction TOP dans une requête sur deux tables
    Par pc75 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/07/2007, 09h31
  5. Réponses: 14
    Dernier message: 04/12/2006, 11h22

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