BookmarkSubscribeRSS Feed
Denana
Calcite | Level 5

Hello everyone. I tried to Update my Values in my Column "DATE of Operation" . Every Date happend before the Diagnoses I want to delete and have an empty Field there, but stll have my ID Number, but just ONCE for the Case 4 and 5.

 

I used the Code :

proc sql;
UPDATE TABLE_1
SET Date_of_Operation=Date of Operation*

case when Date_of_Operation > Date of Diagnosis then Date of Operation= .
end;

 

ID

Date of Diagnosis

Date of Operation

1

02.01.2017

02.01.2017

2

05.09.2015

07.09.2015

3

06.02.2019

09.03.2019

4

08.09.2014

01.01.2014

4

08.09.2014

05.01.2014

5

06.11.2020

01.01.2020

5

06.11.2020

01.02.2020

 

So i want my export like this :

ID

Date of Diagnosis

Date of Operation

1

02.01.2017

02.01.2017

2

05.09.2015

07.09.2015

3

06.02.2019

09.03.2019

4

08.09.2014

 

5

06.11.2020

 

 

My Code is not working. Can someone Help me ?

Thanks

6 REPLIES 6
PeterClemmensen
Tourmaline | Level 20

Is it a requirement to use SQL?

Denana
Calcite | Level 5

First thank you for this Code, it is working. But now I have one more Problem. My Table is looking like this:

 

ID

TUMOR_ID

Date of Diagnosis

OP Date

1

1

02.01.2017

02.01.2017

2

1

05.09.2015

07.09.2015

3

1

06.02.2019

09.03.2019

4

1

08.09.2014

08.09.2014

4

2

25.10.2015

30.10.2015

5

1

06.11.2020

01.01.2020

5

1

06.11.2020

01.02.2020

 

and I want the new Table like this: 

 

ID

TUMOR_ID

Date of Diagnosis

OP Date

1

1

02.01.2017

02.01.2017

2

1

05.09.2015

07.09.2015

3

1

06.02.2019

09.03.2019

4

1

08.09.2014

08.09.2014

4

2

25.10.2015

30.10.2015

5

1

06.11.2020

 

 

With the Code before, I become Deleted also the ID Numer 4 , so it reduce me my Table. I want for the ID Number both Tumor_IDs. 

 

Thanks for you Help!!! 

Denana
Calcite | Level 5
Schould I just change in the CODE do until(last.TUMOR_ID) ?

data want(drop = flag);

do until(last.TUMOR_ID); THIS????
set have;
by ID;
if DateofOperation < DateofDiagnosis then flag = 1;
end;

if flag then DateofOperation = .;

run;
PeterClemmensen
Tourmaline | Level 20

You could use a data step like this

 

data have;
input ID (DateofDiagnosis DateofOperation)(:ddmmyy10.);
format Date: ddmmyyp10.;
datalines;
1 02.01.2017 02.01.2017 
2 05.09.2015 07.09.2015 
3 06.02.2019 09.03.2019 
4 08.09.2014 01.01.2014 
4 08.09.2014 05.01.2014 
5 06.11.2020 01.01.2020 
5 06.11.2020 01.02.2020 
;

data want(drop = flag);

   do until(last.ID);
      set have;
      by ID;
      if DateofOperation < DateofDiagnosis then flag = 1;
   end;

   if flag then DateofOperation = .;

run;

 

Result:

ID DateofDiagnosis DateofOperation
1  02.01.2017      02.01.2017
2  05.09.2015      07.09.2015
3  06.02.2019      09.03.2019
4  08.09.2014      .
5  06.11.2020      .

 

Tom
Super User Tom
Super User

Modifying datasets in place is not a normal way to use SAS.   Unless your data is extremely large you will find it much easier to create new datasets instead.

data have ;
  input id diagdate :yymmdd. operdate :yymmdd. ;
  format diagdate operdate yymmdd10.;
cards;
1 2017-02-01 2017-02-01
2 2015-05-09 2015-07-09
3 2019-06-02 2019-09-03
4 2014-08-09 2014-01-01
4 2014-08-09 2014-05-01
5 2020-06-11 2020-01-01
5 2020-06-11 2020-01-02
;

data expect ;
  input id diagdate :yymmdd. operdate :yymmdd. ;
  format diagdate operdate yymmdd10.;
cards;
1 2017-02-01 2017-02-01
2 2015-05-09 2015-07-09
3 2019-06-02 2019-09-03
4 2014-08-09 .
5 2020-06-11 .
;

proc sql;
create table want as 
  select distinct 
       id
     , diagdate
     , case when operdate < diagdate then . else operdate end as operdate format=yymmdd10.
  from have
  order by 1,2,3
;
quit;

proc compare data=want compare=expect;
run;
       

If you actually need to support a highly volatile dataset then perhaps you should host that data in a database system instead.

Ksharp
Super User
data have;
input ID (DateofDiagnosis DateofOperation)(:ddmmyy10.);
format Date: ddmmyyp10.;
datalines;
1 02.01.2017 02.01.2017 
2 05.09.2015 07.09.2015 
3 06.02.2019 09.03.2019 
4 08.09.2014 01.01.2014 
4 08.09.2014 05.01.2014 
5 06.11.2020 01.01.2020 
5 06.11.2020 01.02.2020 
;
proc sql;
create table want as
select ID,DateofDiagnosis,
ifn(sum(DateofOperation<DateofDiagnosis),.,max(DateofOperation)) as DateofOperation format=ddmmyyp10.
 from have
  group by ID,DateofDiagnosis;
quit;

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 6 replies
  • 460 views
  • 0 likes
  • 4 in conversation