BookmarkSubscribeRSS Feed
TimurShangareev
Calcite | Level 5

I want to get observation number from expression <dsname(where=(...))> by using macro code. So I could write in any place (inside other procedure or %if statement) %if %sysfunc(nobs(dsname(where=(...)))) > 0 %then %do;  BY-statement-code; %end;

My current solution uses PROC FCMP and DOSUBL inside custom function NOBS. After all I use %sysfunc(NOBS(...)). Inside NOBS function I use NOBS ATTRN to obtain answer if possible. Otherwise, inside DOSUBL I use PROC SQL to count observation number. Is there any other universal solution, which more stable than NLOBSF?

I think I could use FETCH inside NOBS function, but I don't know: should I extract WHERE= option and then apply something like If not where_string then delete; But there is a problem, that i can't in one function call extract where_string and use it as code. 

DOSUBL seems very hard for performance. It's intitializes additional environment/space/memory?

Is there a way to do this elegantly and reliably?

 

2 REPLIES 2
Quentin
Super User

What is your concern with using NLOBSF?

 

Years ago I was inspired by this paper by Jack Hamilton:

https://support.sas.com/resources/papers/proceedings/proceedings/sugi26/p095-26.pdf

 

And wrote a obscount macro, the core of which is to use NLOBS if SAS knows the number of records and there is no WHERE options, else use NLOBSF:

    %if %sysfunc(attrn(&idnum, ANOBS)) and %sysfunc(attrn(&idnum, WHSTMT))=0 %then %do;
      %*If sas knows number of obs, and there is no where statement, get nlobs;
      %let nlobs = %sysfunc(attrn(&idnum,nlobs)); %*get number of obs;
    %end;
    %else %if %sysfunc(attrn(&idnum, ANOBS))=0 
              or (1<=%sysfunc(attrn(&idnum, WHSTMT)) and %sysfunc(attrn(&idnum, WHSTMT)) <=3) %then %do;
      %*If sas doesnt know number of obs, or there is a where statement, get nlobsf (this iterates through dataset);
      %let nlobs = %sysfunc(attrn(&idnum,nlobsf)); %*get number of obs;
    %end; 

Yes, DOSUBL is slow compared to most other functions, because it's doing a LOT of work (creating and destroying the side session to run execute the code). 

Tom
Super User Tom
Super User

Why not use FETCH ?  Been using it for a LOOONG time.

https://github.com/sasutils/macros/blob/master/nobs.sas

 

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 2 replies
  • 267 views
  • 2 likes
  • 3 in conversation