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 :

Selection une ligne par mois par patient : le jour de l'entrée à l'hôpital ou le 1er jour ouvré qui suit


Sujet :

SAS Base

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Selection une ligne par mois par patient : le jour de l'entrée à l'hôpital ou le 1er jour ouvré qui suit
    Bonjour,

    j'ai 2 tables:
    Table 1 avec 2 colonnes : numéro de securité sociale du patient et le jour ou il rentré à l'hôpital =quell jour du mois(JEH : un seul chiffre entre 1 et 31)

    Table 2 : la tension du patient qui est relevé plusieurs fois par mois.

    Table 1 :
    NumSecu JEH
    1851295500065 16
    2841124157856 27

    Table2 :
    NumSecu DateRelevéTension Tension
    1851295500065 20171104 124
    1851295500065 20171108 112
    1851295500065 20171111 139
    1851295500065 20171116 114
    1851295500065 20171121 124
    1851295500065 20171124 123
    1851295500065 20171126 111
    1851295500065 20171205 124
    1851295500065 20171206 118
    1851295500065 20171207 132
    1851295500065 20171213 118
    1851295500065 20171215 124
    1851295500065 20171218 121
    1851295500065 20171223 111

    La table que j'essaye de construire est de 4 colonnes:
    Mois NumSecu Tension_JEH MaxTension_30Joursprécédents
    201711 1851295500065 114 139
    201712 1851295500065 121 132

    Explication:
    dans cette Table 3 il doit y avoir une ligne par mois pour chaque patient:
    pour le patient 1851295500065 : il faut prendre la tension au JEH (qui pour ce patient est le 16 du mois) : ou si pas de tension en table 2 au JEH on prend la tension le jour qui suit immédiatement.
    Par exemple patient 1851295500065 : au mois de novembre on a au 20171116: 114 alors pour 201711 Tension_JEH = 114
    mais pour décembre 2017 on a pas de tension qui a été relevé le 16 décembre donc pour Tension_JEH pour 201712 on prend la tension au 20171218 : 121.

    Colonne MaxTension_30Joursprécédents : on prend la tension maximale relevé entre le 20171117 et le 20171218, c'est à dire depuis le JEH du mois precedent.

    Faire le lien entre les 2 tables c'est ca qui me bloque je suis pas expert en SAS et sans macro j'y arrive pas c'est peut-être impossible.

    J'éspère que je trouverai de l'aide ici,

    Merci à tous ceux qui m'aideront ou me guider pour le début,

    Mryem

  2. #2
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2017
    Messages : 63
    Points : 82
    Points
    82
    Par défaut
    Bonjour,

    J'aurais besoin d'une précision pour vous aider. Le JEH est-il toujours antérieur au premier relevé? N'y a t-il pas la possibilité qu'un patient ait été hospitalisé plusieurs fois (auquel cas nous aurions plusieurs JEH et potentiellement un JEH postérieur à certaines dates de relevé de tension)?

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse.

    J'ai déja nettoyé la data il n'y qu'1 seul JEH par patient (c'est le dernier en fait) : c'est là que le relevé de la tension commence : si un patient est entré à l'hôpital le 14/01/2017 et le 09/06/2017 bah le JEH c'est le 09 (et donc le relevé de la tension commence le 20170609)

    et j'aimerai au final garder MAX 12 lignes par patient (donc les 12 derniers mois) : on est en Janvier 2018 donc les 12 derniers pour chaque patient (certains de 201701 à 201712 d'autres de 201702 à 201801 selon que le JEH est avant le 29 ou après : puisqu'on est le 29 Janvier aujourd'hui).

    Encore merci.

    je pense que c'est impossible sans macro mais je maitrise pas les macros

  4. #4
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2017
    Messages : 63
    Points : 82
    Points
    82
    Par défaut
    Une proposition :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    data table1;
    input 
    NumSecu JEH;
    datalines;
    1851295500065 16
    2841124157856 27
    ;
    run;
     
    data table2;
    input 
    NumSecu DateReleveTension Tension;
    datalines;
    1851295500065 20171104 124
    1851295500065 20171108 112
    1851295500065 20171111 139
    1851295500065 20171116 114
    1851295500065 20171121 124
    1851295500065 20171124 123
    1851295500065 20171126 111
    1851295500065 20171205 124
    1851295500065 20171206 118
    1851295500065 20171207 132
    1851295500065 20171213 118
    1851295500065 20171215 124
    1851295500065 20171218 121
    1851295500065 20171223 111
    ;
    run;
     
     
     
    proc sort data = table1;  by NumSecu; run;
     
    proc sort data = table2;  by NumSecu; run;
     
    data table3;
       merge table1 table2;
       by NumSecu;
       num_mois = input(substr(put(DateReleveTension,$8.),5,2),2.);
    run;
     
    proc sort data = table3; by NumSecu descending DateReleveTension; run;
     
    /* Tension JEH */
    data table3;
       set table3;
       by NumSecu;
       if first.NumSecu then Tension_JEH = Tension;
    run;
     
     
    /* Max tension par mois */
    proc sort data = table3; by numsecu num_mois tension; run;
     
    data table3;
       set table3;
       by numsecu num_mois tension;
       if last.num_mois then max_tension = tension;
     
       /* si vous voulez ne garder que la tension maximale de chaque mois pour chaque patient ainsi que la tension_JEH */
       if max_tension ne . or Tension_JEH ne . then output;
    run;
     
    proc print data = table3; run;

    N'hésitez pas à me faire un retour si cela ne correspond pas tout à fait à votre demande.




    EDIT : pour ne garder que les douze derniers mois (non testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* garder que les douzes derniers mois */
    data table3;
       format date DDMMYY10.;
       set table3;
       date = input(put(DateReleveTension,$8.),YYMMDD8.)
       if intck('YEAR', date, today(), 'C')=0 then output;
    run;

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre aide,


    Mon but en fait est d'obtenir :
    NumSecu JEH mois Tension_JEH max_tension
    1851295500065 16 201711 114 139
    1851295500065 16 201712 121 132

    Parce que pour Novembre 2017 : la tension au JEH (au 16 nov) est : 114 donc Tension_JEH = 114
    et entre le 20171017 et le 20171116 la tension max est 139.

    Pour décembre 2017 : la tension au JEH (au 16 décembre il n'y en a pas donc je prend celle qui suit immédiatement c'est le 20171218) : c'est 121 donc Tension_JEH = 121
    Et entre le 20171117 et le 20171218 la tension max est 132




    voilà ce que j'obtiens avec ce code, dans la table T3:

    NumSecu JEH DateReleveTension Tension num_mois Tension_JEH max_tension
    1851295500065 16 20171111 139 11 139
    1851295500065 16 20171223 111 12 111
    1851295500065 16 20171207 132 12 132



    En modifiant votre code j'ai un peu mieux mais pas beaucoup mieux malheuresuement, voilà ce que j'obtiens avec le code qui suit:
    NumSecu JEH DateReleveTension Tension_JEH
    1851295500065 16 20171116 114
    2841124157856 27

    pour le patient 1851295500065 j'ai la bonne Tension_JEH pour Novembre 2017 avec ce merge mais pour 201712 ca marche pas parce que je n'ai pas la tension au 16 déembre dans table2 (je veux prendre celle de 20171218).
    Pour la tension max j'ai rien qui marche pour l'instant.



    data table1;
    input
    NumSecu JEH;
    datalines;
    1851295500065 16
    2841124157856 27
    ;
    run;

    data table2;
    input
    NumSecu DateReleveTension Tension;
    datalines;
    1851295500065 20171104 124
    1851295500065 20171108 112
    1851295500065 20171111 139
    1851295500065 20171116 114
    1851295500065 20171121 124
    1851295500065 20171124 123
    1851295500065 20171126 111
    1851295500065 20171205 124
    1851295500065 20171206 118
    1851295500065 20171207 132
    1851295500065 20171213 118
    1851295500065 20171215 124
    1851295500065 20171218 121
    1851295500065 20171223 111
    ;
    run;

    data table2;
    set table2;
    JEH= input(substr(put(DateReleveTension,$8.),7,2),2.);
    run;

    proc sort data = table1; by NumSecu JEH; run;

    proc sort data = table2; by NumSecu JEH; run;

    data table3;
    merge table1(in=A) table2(in=B);
    if A;
    by NumSecu JEH;
    rename Tension=Tension_JEH;
    run;[/CODE]:

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Je ne connais pas du tout les macros mais si quelq'un a une macro je suis preneuse mon stage se termine vendredi
    et maintenant je suis convaincu que sans macro c'est impossible à faire

    car un merge sur SAS ne se fait que sur des valeurs identique dans les 2 tables (enfin d'après ce que j'ai compris)

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    J'ai trouvé comment faire pour Tension_JEH (mais pas pour max_tension ce qui est plus difficile):

    Voilà j'obtiens exactement ce que je veux pour Tension_JEH:

    NumSecu DateReleveTension Tension_JEH mois JEH
    1851295500065 20171116 114 201711 16
    1851295500065 20171218 121 201712 16


    data table1;
    input
    NumSecu JEH;
    datalines;
    1851295500065 16
    2841124157856 27
    ;
    run;

    data table2;
    input
    NumSecu DateReleveTension Tension;
    datalines;
    1851295500065 20171104 124
    1851295500065 20171108 112
    1851295500065 20171111 139
    1851295500065 20171116 114
    1851295500065 20171121 124
    1851295500065 20171124 123
    1851295500065 20171126 111
    1851295500065 20171205 124
    1851295500065 20171206 118
    1851295500065 20171207 132
    1851295500065 20171213 118
    1851295500065 20171215 124
    1851295500065 20171218 121
    1851295500065 20171223 111
    ;
    run;

    data table2;
    set table2;
    num_jour= input(substr(put(DateReleveTension,$8.),7,2),2.);
    mois= input(substr(put(DateReleveTension,$8.),1,6),6.);
    run;

    proc sort data = table1; by NumSecu; run;

    proc sort data = table2; by NumSecu; run;

    data table3;
    merge table2(in=A) table1(in=B);
    if A;
    by NumSecu;
    run;

    data table3(rename=(Tension=Tension_JEH) drop=num_jour);
    set table3;
    where num_jour >= JEH;
    run;

    proc sort data = table3 nodupkey;
    by NumSecu mois;
    run;

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bonjour JQuem,

    Je viens de comprendre pourquoi votre code ne marche pas pour max_tension,
    c'est parce que avec ce code on prend :
    par exemple pour 201712 pour 1851295500065 le code prend le max de Tension entre le 20171201 et le 20171218 et donc le max depuis le début du mois.


    Ex : pour 1851295500065 pour 201712 le max_Tension que je cherche c'est le max de Tension entre le 20171117 et le 20171218 (dans ce cas là).

    Encore merci pour votre aide

  9. #9
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    C'est vrai que c'était très compliqué peut-être même impossible.

    mais merci quand même d'avoir essayer.

    Mryem

  10. #10
    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 Mryem Voir le message
    Je ne connais pas du tout les macros mais si quelq'un a une macro je suis preneuse mon stage se termine vendredi
    et maintenant je suis convaincu que sans macro c'est impossible à faire

    car un merge sur SAS ne se fait que sur des valeurs identique dans les 2 tables (enfin d'après ce que j'ai compris)
    Bonjour,
    Je ne pense pas que la problématique nécessite une macro pour calculer le maximum. C'est une proposition, en une seule étape data, qui permet de sélectionner la tension au JEH, montrant ainsi comment calculer le Max_Tension_30Joursprécédents dans une telle situation. Tout est possible avec SAS. A vérifier

    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
    proc sort data = table1 ;  by NumSecu; run ;
    proc sort data = table2 ;  by NumSecu; run ;
     
    data table3 (keep=NumSecu Mois Tension max_tension) ;
    merge table2(in=A) table1(in=B);
    if A;
    by NumSecu;
    retain max_tension ;
    _DateReleveTension=input(cat(DateReleveTension), yymmdd8.) ; 
    date=mdy( month(_DateReleveTension), JEH, year(_DateReleveTension) ) ; 
    max_tension=max(max_tension, Tension) ;
    Mois=lag(_DateReleveTension) ; 
    if _DateReleveTension = date then do ; output ; max_tension=0 ;  end ;	
    if lag(_DateReleveTension) < lag(date) < _DateReleveTension  then do ;
                                           output ; max_tension=0 ;  end ;  
    format _DateReleveTension date ddmmyy10. Mois yymmn6. ; 
    run ;
    Cordialement Ward

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

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Citation Envoyé par Mryem Voir le message
    C'est vrai que c'était très compliqué peut-être même impossible.

    mais merci quand même d'avoir essayer.

    Mryem
    C'est surtout que les problèmes mal spécifiés ont rarement la solution attendue.

    Cordialement

  12. #12
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci hossward pour ta tentative, aussi peu de lignes de codes alors que moi j'en ai 10 fois plus ca à l'air magique mais

    Cela ne fonctionne pas malheureusement:

    dans la table3 3 types de pb:

    1) j'ai pour de nombreux Num_Secu: 2 ou 3 lignes pour un même mois

    2)pour d'autres NumSecu je n'ai aucune valeur pour certains mois (bien que j'ai une valeur Tension dans table2 pour ce mois en question)

    3) il y a certains numSecu qui ne sont pas dans du tout dans table3 (alors qu'ils sont dans table 1 et dans table2)

    Je ne comprends pas pourquoi j'ai ces pb car pour l'instant je ne comprends pas le code mais j'essaye de creuser

  13. #13
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Peut-être que c'est effectivement pas clair parce que c'est difficle à expliquer alors j'ajoute un fichier excel avec des exemples : table1 table2 et la table3 que je souhaite.

    Encore dsl si c'était pas clair
    Fichiers attachés Fichiers attachés

  14. #14
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    J'ai réussi pour la plus grande partie. En faisant des proc sort et ensuite nodupkey (pour garder 1 seule valeur par mois) : je retiens (de table2) le jour du MEME mois qui est disponible AU JEH ou le jour juste AVANT.

    Pb : quand le JEH c'est en début de mois et que je n'ai pas de valeur dans table2 au JEH ou juste avant pour ce même mois: dans ce cas des fois il me faut prendre le 31 ou 30 ou.. du mois PRECEDENT et là ma méthode ne marche pas.

Discussions similaires

  1. [MCD] Nombre d'heures travaillées par mois par année par compte
    Par Tidus159 dans le forum Schéma
    Réponses: 9
    Dernier message: 11/03/2011, 12h20
  2. [AC-2003] Statistiques, mois par mois, en une seule requete ?
    Par Waals dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 04/08/2010, 16h37
  3. [AC-2007] Sélectionner les résultats d'une requête analyse croisée par mois
    Par cslbcg dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 03/12/2009, 16h21
  4. créer une requête pour regrouper par mois
    Par kuhnden dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 26/01/2008, 13h41
  5. Réponses: 1
    Dernier message: 16/08/2007, 17h48

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