Bonsoir, je rencontre quelques difficultés avec une SQL qui ne semble pas fonctionner comme je le voudrais sur 10% des observations...

J'ai un gros fichier de plusieurs Go que je souhaiterais faire diminuer de taille.
Pour cela je voulais éclater le fichier en plusieurs fichiers (après sommation des lignes sur chaque fichier) puis relier tout ça par des clés de jointure.

Voici à quoi ressemble mon code.

J'ai un fichier "base" contenant N variables X1 à XN et M variables Y1 à YM.
Ces variables sont des variables caractères avec quelques variables numériques (des poids pas forcément entiers genre 0.8755456687534 ).

Je créé un fichier de sommation "SUM_Y"des variables Y1 à YM.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
DATA base;SET base;_w=1;RUN;
 
PROC SUMMARY DATA=base missing;
CLASS Y1 Y2.... YM;
VAR _w;
TYPES Y1*Y2*..*YM;
OUTPUT OUT=SUM_Y SUM=;
RUN;
Je crée un identifiant de ligne pour SUM_Y

Code : Sélectionner tout - Visualiser dans une fenêtre à part
DATA SUM_Y;SET SUM_Y;id=_n_;RUN;
Ensuite je récupère l'identifiant dans le fichier initial

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
PROC SQL;
CREATE TABLE Base 
AS SELECT Tab1.*,Tab2.id 
FROM BASE AS Tab1
LEFT JOIN SUM_Y AS Tab2
ON
(     Tab1.Y1=TAB2.Y1
AND Tab1.Y2=Tab2.Y2
AND Tab1.Y3=Tab2.Y3
AND ...
AND Tab1.YM=Tab2.YM);
QUIT;
Le code est simple et à première vue le code et la démarche ne me semble pas poser de problèmes particuliers.

Je continue donc.
Par la suite après avoir conservé id et enlevé Y1 à YM dans base,
lorsque je souhaite remettre Y1 à YM dans base via la table SUM_Y et la clé de jointure id je n'obtiens pas exactement le même fichier.
En fait pour la plus part des observations ça marche sauf pour environ 10% d'entre elles.

En regardant de plus près, je m'aperçois alors que pour ces observations l'identifiant Id est en valeur manquante dans la table base au lieu d'avoir la valeur trouvée dans SUM_Y , et en fait c'est donc la jointure

Jointure "J1" :

ON
( Tab1.Y1=TAB2.Y1
AND Tab1.Y2=Tab2.Y2
AND Tab1.Y3=Tab2.Y3
AND ...
AND Tab1.YM=Tab2.YM);

qui n'a pas marché sur ces observations.

J'ai donc une explication partielle, mais je n'ai pas l'explication du pourquoi la jointure "J1" n'a pas correctement fonctionné compte tenu que

1-) Les Y1 à YM contenus dans le fichier SUM_Y proviennent du fichier initial (pas de redimensionnement ou autre), ils sont issus de la SUMMARY donc à priori pas de soucis, et tout M-Uplet (Y1,...,YM) de base à sa correspondance dans SUM_Y et donc un identifiant récupérable.

2-) Que les M_Uplet (Y1,...,YM) pour lesquels cela ne marche pas, n'ont rien de spécifique à première vue par rapport aux M_Uplet (Y1,...,YM) pour lesquels ça marche...(côté numérique les poids pour lesquels cela ne passe pas sont aussi bien des "1" que des 1.378556636387 )



Avez vous des idées ?
Est-ce que c'est les variables numériques qui pourraient jouer ici des tours ?
Comme j'ai un soupçon (nullement étayé cela étant) que ce serait peut-être ça, comment retomber sur ses pattes ?
Est-ce autre chose que je ne vois pas ?
J'en perd mon latin ou mon SAS...
Eventuellement auriez vous un code alternatif pour faire ce genre de choses ?

Merci de vos lumières !