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 :

Recherche dans une table SAS


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Recherche dans une table SAS
    Bonjour à tous.

    Je suis confronté à un problème auquel je ne trouve pas de solution.

    J'ai une table A dans laquelle j'ai une colonne avec des numéros de patients et une seconde contenant des dates de prélèvements.
    Une table B contenant des numéros patients (identique à ceux dans la table A) et les dates d'écriture des comptes rendus.

    Je souhaiterais vérifier qu'il ne me manque pas des comptes rendus pour certains patients.

    La complexité de la chose est que les comptes rendu ne sont pas forcément écrit le jour du prélèvement. Il faudrait donc vérifier pour chaque patient et chaque prélèvement (1 patient peut avoir plusieurs prélèvements) qu'il y ait un compte rendu d'écrit dans la semaine.

    Quelqu'un à une idée de comment procéder car moi je sèche en plein.

    Merci par avance.

  2. #2
    Membre éprouvé
    Format WEEKW.
    Bonjour,

    Je vous conseille de générer des dates au format "anneeWsemaine". Ce format est proposé par la norme ISO 8601 (paragraphe numéro de semaine / notation normalisée).

    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
    data test;
      input date1 :ddmmyy10.;
      format date1 ddmmyy10.;
      cards;
    01/03/2020
    02/03/2020
    03/03/2020
    04/03/2020
    05/03/2020
    06/03/2020
    07/03/2020
    08/03/2020
    09/03/2020
    ;
    run;


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    data test;
      set test;
      date2=date1;
      format date2 WEEKW9.;
      datew=substr(put(date1,WEEKW9.),1,7);
    run;


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
         date1    date2         datew
    01/03/2020    2020W0807    2020W08
    02/03/2020    2020W0901    2020W09
    03/03/2020    2020W0902    2020W09
    04/03/2020    2020W0903    2020W09
    05/03/2020    2020W0904    2020W09
    06/03/2020    2020W0905    2020W09
    07/03/2020    2020W0906    2020W09
    08/03/2020    2020W0907    2020W09
    09/03/2020    2020W1001    2020W10


    ou même :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data test;
      set test;
      date2=put(date1,WEEKW6.);
    run;


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
         date1    date2
    01/03/2020    20W08
    02/03/2020    20W09
    03/03/2020    20W09
    04/03/2020    20W09
    05/03/2020    20W09
    06/03/2020    20W09
    07/03/2020    20W09
    08/03/2020    20W09
    09/03/2020    20W10


    Cordialement

  3. #3
    Membre à l'essai
    voici un exemple similaire , si le prélèvement est enregistrer entre lundi et vendredi on met exist sinon exist pas

    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
    data tab_A;
    input ID date_pr ddmmyy10.;
    format date_pr ddmmyy10.;
    cards;
    1 10/02/2020
    1 12/02/2020
    1 31/12/2020
    2 20/01/2020
    2 20/02/2020
    2 22/02/2020
    3 01/02/2020
    ;
    run;
     
    data tab_b;
    input ID date_cr ddmmyy10.;
    format date_cr ddmmyy10.;
    cards;
    1 10/02/2020
    2 21/02/2020
    3 04/02/2020
    1 01/01/2021
    ;
    run;
     
     
    proc sql;
    create table tab_verif as 
     
    select a.*,
    b.date_cr,
    case when date_cr is not null then 'exist' else 'exist pas ' end as verif 
    from tab_A a 
    left join tab_b b on a.ID eq b.ID and (a.date_pr between intnx('week',b.date_cr,0)+1 and intnx('week',b.date_cr,1)-2)
    ;
    run;

  4. #4
    Membre expérimenté
    Bonjour,
    Une solution à l'aide d'une table de hachage :

    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
     
    data tab_A ;
    input ID date_pr ddmmyy10. ;
    format date_pr ddmmyy10.;
    cards;
    1 09/02/2020
    1 10/02/2020
    1 12/02/2020
    1 26/12/2020
    1 31/12/2020
    2 20/01/2020
    2 20/02/2020
    2 22/02/2020
    2 04/02/2020
    3 01/02/2020
    ;   
     
    data tab_B ;
    input ID date_cr ddmmyy10.;
    format date_cr ddmmyy10.;
    cards;
    1 10/02/2020
    2 21/02/2020
    3 03/02/2020
    1 28/02/2020
    ;	 
     
    data Verif ;
     if _n_ = 1 then do;
     if 0 then set tab_b ;
     declare hash hoss(dataset:'tab_B') ;
     hoss.definekey ('ID');
     hoss.definedata('date_cr');	
     hoss.definedone();
    end ;  
     
    set tab_A ;
    if hoss.find()=0 then 
    Verif=ifc(intnx('week',date_pr,0) <= date_pr <= date_cr,'Exist','Ne_Exist_Pas' ) ; 
    run;


    Note :
    Il est également possible de résoudre cette problématique à l'aide de l'instruction MERGE.
    Un trie des deux tables est indispensable.

    Cordialement
    Ward