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 :

Prend le niveau maximum avec une condition sur les dates (SAS)


Sujet :

SAS Base

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Prend le niveau maximum avec une condition sur les dates (SAS)
    Bonjour Forum,

    J'ai besoin d'avoir dans mon tableau le niveau max à condition des date de début et date de fin pour chaque ID:

    exemple :

    ID Date de début date de fin Etat Niveau
    1 01/02/2017 01/01/2099 en cours niveau1
    1 01/02/2017 01/01/2099 en cours base
    2 01/02/2018 31/05/2018 arrêter Niveau2
    2 01/02/2017 01/01/2099 en cours base
    3 01/02/2017 01/01/2099 en cours base
    3 01/02/2018 01/01/2099 en cours niveau1
    4 01/02/2017 31/01/2018 arrêter niveau3
    4 01/02/2017 01/01/2099 en cours base

    Résultats souhaités:

    ID Date de début date de fin Etat Niveau
    1 01/02/2017 01/01/2099 en cours niveau1
    1 01/02/2017 01/01/2099 en cours niveau1
    2 01/02/2018 31/05/2018 arrêter base
    2 01/02/2017 01/01/2099 en cours base
    3 01/02/2017 01/01/2099 en cours niveau1
    3 01/02/2018 01/01/2099 en cours niveau1
    4 01/02/2017 31/01/2018 arrêter base
    4 01/02/2017 01/01/2099 en cours base

    Explications:
    • ID 1 : on garde "Niveau1" par ce qu'il est le niveau maximum entre Base et Niveau1
    • ID 2 : on garde "Base" par ce que la date de fin pour Niveau2 est terminé et l'état est arrêter
    • ID 3 : on garde "niveau1" par ce qu'il est le niveau maximum entre les deux
    • ID4 : on garde "base" par ce que la date de fin pour Niveau3 est terminé et l'état est arrêter


    Je reste à votre disposition pour plus d'information

    J'en ai vraiment besoin d'une solution!

    Merci par avance

  2. #2
    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
    Bonjour,
    Je te propose la solution suivante qui se base, uniquement, sur les deux variables Etat et Niveau :

    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
     
    data Ta_Base ;
    input ID: dtdeb: ddmmyy10. dtfin: ddmmyy10. Etat $8. Niveau $8.;
    format dtdeb dtfin ddmmyy10. ;
    cards ;
    1 01/02/2017 01/01/2099 en cours niveau1
    1 01/02/2017 01/01/2099 en cours base
    2 01/02/2018 31/05/2018 arrêter Niveau2
    2 01/02/2017 01/01/2099 en cours base
    3 01/02/2017 01/01/2099 en cours base
    3 01/02/2018 01/01/2099 en cours niveau1
    4 01/02/2017 31/01/2018 arrêter niveau3
    4 01/02/2017 01/01/2099 en cours base
    ; run 
     
    /* Trier Ta base dans l’ordre décroissant de la façon suivante */
    Proc sort data= Ta_Base ;
    By ID descending dtdeb dtfin ;
    run ; 
     
    data Ta_Base (drop=Temp) ;
    set Ta_Base ;
    length Temp $10. ;
    by id ;
    retain Temp ; 
    if Etat="arrêter" then Temp="Base" ; 
    else if first.id  then Temp=Niveau ; 
    Niveau=Temp ;
    run ;
    Cdt Ward

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci bcp pour cette solution.
    Par contre, ca ne traite pas l'ensemble de ma problématique ..
    Par exemple au cas ou, si on trouve :

    ID Date de début date de fin Etat Niveau
    1 01/02/2017 01/01/2018 arrêter niveau2
    1 01/02/2017 01/01/2099 en cours base
    1 01/02/2018 31/05/2099 en cours Niveau1

    dans ce cas là pour les en cours faut reprendre que le Niveau1

    Est ce que c'est possible?

    Merci d'avance

  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
    Bonjour,
    Je te propose une nouvelle version pour ton exemple :
    On crée une table de préparation dans la quelle on code la variable à trier dans la PROC SORT.

    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
    data Ta_Base ;
    input ID: dtdeb: ddmmyy10. dtfin: ddmmyy10. Etat $8. Niveau $8.;
    format dtdeb dtfin ddmmyy10. ;
    cards ;
    5 01/02/2017 01/01/2018 arrêter niveau2
    5 01/02/2017 01/01/2099 en cours base  
    5 01/02/2018 31/05/2099 en cours niveau1
    ; run ;  
     
    data Prepa ;
    set  Ta_Base ;
    VarAtrier=IFC(Etat='arrêter', 'arrêter', Niveau) ; 
    run ;  
     
    Proc sort data=Prepa ;
    By ID descending VarAtrier ;
    run ;   
     
    data Finale (drop=VarAtrier Temp) ;
    set Prepa ;
    length Temp $10. ;
    by id ;
    retain Temp ;  
    if first.id then Temp=Niveau ; Niveau=Temp ;
    run ;
    Cdt Ward

Discussions similaires

  1. [XL-2013] Fusionner 2 lignes ou plus en une seule en se basant sur une condition sur les dates.
    Par aymen.fst dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 06/02/2019, 13h36
  2. Construire un range avec une condition sur les lignes
    Par tamtam64 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 22/06/2015, 22h57
  3. Problème avec une requête sur les dates
    Par diblasio dans le forum Requêtes
    Réponses: 11
    Dernier message: 09/08/2011, 16h00
  4. [XSLT]Trouver un noeud avec une condition sur ses sous-noeuds
    Par enguerran dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 23/02/2007, 11h00
  5. Requete avec une condition sur le resultat [10g]
    Par hotkebab99 dans le forum Oracle
    Réponses: 5
    Dernier message: 12/09/2006, 11h33

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