Bonjour à tous,

J'ai actuellement un programme qui me calcule divers agrégats à partir d'une table contenant à la fois beaucoup d'individus et beaucoup de variables. Si certaines variables décrivent un individu et sont invariables dans le temps (sexe, date de naissance, ...) d'autres sont variables au cours du temps, selon un pas trimestriel, et sont calculées sur un grand nombre d'années.

Mon code actuel fonctionne très bien au niveau des résultats qu'il génère, mais il met longtemps à tourner. Si je suis conscient qu'avec une grosse table en entrée et autant de sorties à produire * le nombre d'années sur lesquelles on fait les sorties va nécessairement demander du temps, je me demandais s'il n'était pas possible de trouver une autre manière de coder afin de réduire un peu le temps de traitement. J'ai notamment lu que les fonctions ralentissent beaucoup les proc SQL mais je n'ai pas encore trouvé moyen de m'en passer.

Voici un petit extrait de mon code de sortie :

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
 
%macro testOptimDuree;
data resultats; run;
data test_duree; run;
 
%do a=2017 %to 2025;
proc sql;
create table test_duree as 
select	sum(
			(%do m=1 %to 10 %by 3;
				%let date_actuelle = mdy(%sysfunc(mod(%sysevalf(&m.+3),12)),1,%sysevalf(%sysfunc(int((&m.+3)/12))+&a.));
				(sexe="M") * 
				max(  0,
				( min(&date_actuelle.,date_deces,date_fin)
					* ((date_deces ne .) and (date_fin ne .))
				+ min(&date_actuelle.,max(date_deces,date_fin)) 
					* (((date_deces ne .) and (date_fin=.)) or ((date_deces=.) and (date_fin ne .)))
				+ &date_actuelle.
					* ((date_deces=.) and (date_fin=.))
				- max(date_deb_act,mdy(&m.,1,&a.)) )  )
				/ (&date_actuelle.-mdy(&m.,1,&a.)) 
				* (1-1/7*(tpartiel_&a._%sysevalf(%sysfunc(int(&m./12))+1)=80))*(etat_&a._%sysevalf(%sysfunc(int(&m./12))+1) in(1,2,3,4,5,6,7)) +
			%end;  0) / 4) as var_sortie_hommes
from tableEntree;
quit;
data resultats; 
		set resultats test_duree; 
	run;
%end;
%mend;
%testOptimDuree;


Si quelqu'un a une idée, quelle qu'elle soit, je suis preneur !
Merci
Alqua