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 :

Sélectionner les 10 premières et les 10 dernières observations d'une table ?


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 27
    Points : 25
    Points
    25
    Par défaut Sélectionner les 10 premières et les 10 dernières observations d'une table ?
    Bonjour..

    Je dois analyser un certain nombre d ’observations qui sont les ‘resultats ‘ d’une procedure “tabulate”
    Donc, apres une proc ‘tabulate’ j’ai une table où le nombre des observations est different d'un mois a l’autre. J’aimerais travailler seulement sur les 10 premieres et les 10 dernieres observations de cette table ….

    Connaissez-vous un commande qui puisse me permettre de faire ce type de sélection ?

    Amicalement

  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 le code suivant :
    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 table ;
    do var=101 to 500 ; output ; end ; 
    run ;
     
    data _null_;
          set table nobs=Num_obs;
          call symputx('Num', Num_obs);
          stop;
    run;
     
    data select ;
    set table ;
    if 1 <= _N_ <= 10 or &num-9 <= _N_ <= &num ;
    run ;
    Ward

  3. #3
    Membre éclairé
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Points : 823
    Points
    823
    Par défaut
    Pour gagner un peut en temps de traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DATA SELECT ;
    SET TABLE ( obs = 10 )
        TABLE ( firstobs = %eval(&num.-9)  );
    run ;

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    Encore un peu plus rapide, mais attention cette notion de "ligne" n'existe que pour des tables SAS, cela n'existe pas pour Oracle, DB2 ou netezza.

    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
    data WORK.TABLE ;
       do var = 101 to 500; 
          output ; 
       end; 
    run;
     
    %let dsid = %sysfunc(open(WORK.TABLE));
    %let nobs = %sysfunc(attrn(&dsid, NLOBS));
    %let rc = %sysfunc(close(&dsid));
    %put nobs = <&nobs>;
     
    data _NULL_;
       do range = 1 to 10;
          set WORK.TABLE point=range;
          put var=;
       end; 
       do range = &nobs - 10 to &nobs;
          set WORK.TABLE point=range;
          put var=;
       end;
       stop;
    run;

  5. #5
    Membre éprouvé
    Avatar de Stackware
    Homme Profil pro
    ArchiDuc de la Sasserie
    Inscrit en
    Juillet 2013
    Messages
    439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ArchiDuc de la Sasserie
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2013
    Messages : 439
    Points : 1 017
    Points
    1 017
    Billets dans le blog
    4
    Par défaut
    Salut,

    En fait, si : en Oracle, on a le mot clé ROWNUM qui permet de filtrer un résultat sur son n° de ligne.
    En ajoutant
    Where ROWNUM <= 5
    on obtient les 5 premières lignes de résultat par exemple.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    Attention,

    rien ne dit que entre deux select les même lignes seront retournées

  7. #7
    Membre éprouvé
    Avatar de Stackware
    Homme Profil pro
    ArchiDuc de la Sasserie
    Inscrit en
    Juillet 2013
    Messages
    439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ArchiDuc de la Sasserie
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2013
    Messages : 439
    Points : 1 017
    Points
    1 017
    Billets dans le blog
    4
    Par défaut
    Si les tables en entrée n'ont pas changé, si, ce sera pareil. C'est pareil pour SAS
    Si on change les données en entrée, les lignes en sortie risquent de ne pas être nécessairement les mêmes effectivement, et c'est pareil pour SAS aussi.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    nope, il peut y avoir plusieurs cas où on ne change pas les données en entrée et où on aura des données différentes entre deux SELECT.
    L'optimizer peut décider de renvoyer telle/telle ligne en fonction de statistiques, ou d'un parallélisme présent sur la table.

    ROWNUM est le numéro de la ligne renvoyée par le select, pas le numéro de la ligne dans la table.

    par exemple, ce code ne renvoie aucune ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select *
    from SYS.ALL_TABLES
    where ROWNUM > 1

  9. #9
    Membre éprouvé
    Avatar de Stackware
    Homme Profil pro
    ArchiDuc de la Sasserie
    Inscrit en
    Juillet 2013
    Messages
    439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ArchiDuc de la Sasserie
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2013
    Messages : 439
    Points : 1 017
    Points
    1 017
    Billets dans le blog
    4
    Par défaut

    Content que tu reconnaisses que ROWNUM correspond au n° de la ligne de résultat. Je ne crois pas avoir affirmé le contraire. ROWID identifie de manière unique chaque ligne du résultat également.
    Pour les changements de statistiques, etc. tu as raison. L'ordre du résultat peut changer (avec SAS aussi sans doute). Une instruction ORDER BY devrait s'assurer de la pérennité de ce résultat, et permettre de traiter les N lignes désirées, pas vrai?

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    il faudrait alors coder ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * 
    FROM  (SELECT * 
               FROM TABLE ORDER BY ID
             )
       WHERE ROWNUM < 10
    ;
    pour que le ROWNUM soit fait apres avoir sélectionné les lignes

  11. #11
    Membre éprouvé
    Avatar de Stackware
    Homme Profil pro
    ArchiDuc de la Sasserie
    Inscrit en
    Juillet 2013
    Messages
    439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ArchiDuc de la Sasserie
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2013
    Messages : 439
    Points : 1 017
    Points
    1 017
    Billets dans le blog
    4
    Par défaut
    Oui, absolument

    Pour DB2, il s'agit de ROW_NUMBER() pour avoir un équivalent de ROWNUM. En Netezza, on peut utiliser LIMIT X OFFSET Y (où X est le nombre de lignes désiré et Y le n° de la ligne de résultat à partir de laquelle on doit commencer à compter les X).

    J'adore les SGBD

  12. #12
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Beaucoup de solutions mais je propose aussi une!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /*Voilà je veux créer ma table*/
    data essai;
    do i=5 to 40000 by 5;
    output;
    end;
    run;
    /*je veux sélectionner les 10 premières et les 10 dernières observations*/
    data essai1;
    set essai;
    call Symputx("nb",_N_);
    if _N_>10 and _N_<%eval(&nb-9) then delete;
    run;

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/06/2013, 16h30
  2. [PROC] Sélectionner les 2 dernières lignes d'une table
    Par Lamyaa34 dans le forum SAS Base
    Réponses: 16
    Dernier message: 29/06/2011, 16h02
  3. Réponses: 1
    Dernier message: 28/08/2008, 22h53
  4. Réponses: 2
    Dernier message: 12/06/2008, 11h53
  5. Réponses: 2
    Dernier message: 28/02/2007, 20h20

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