Je traite un grand ensemble de données (30 millions de lignes) et j'ai besoin de tirer les trois dates les plus récentes (auxquelles un nombre indéterminé de lignes peut être attaché) Donc, comme 03MAR2016 pourrait avoir 2 lignes 27FEB2016 pourrait avoir 10 et 25FEB2016 pourrait avoir 3. Comment puis-je dire "Sélectionnez tout ce qui tombe dans le dernier X nombre de valeurs dans cet ensemble, indépendamment du nombre de lignes qu'il y a"?Comment tirer le dernier N nombre de dates dans SAS SQL
Répondre
Comme vous ne pouvez pas trier dans une vue en ligne/sous-requête, vous devrez diviser votre instruction SQL en deux parties:
- Trier la date décroissantes et obtenir les valeurs distinctes
- Joignez-vous à revenir à les données d'origine et la limite à la première 3
Mais comme indiqué précédemment, SQL n'est pas bon dans ce genre d'opération.
DATA input_data ;
INPUT date value ;
CARDS ;
20160101 1
20160101 2
20160101 3
20160102 1
20160103 1
20160104 1
20160105 1
20160105 2
20160105 3
;
proc sql _method;
create table DATE_ID as
select distinct DATE
from input_data
order by DATE DESC;
create table output_data as
select data.*
from (select *
from DATE_ID
where monotonic() <= 3
) id
inner join input_data data
on id.DATE = data.DATE
;
quit;
Vous devez décomposer ceci en deux tâches.
- Déterminer quelles dates sont les trois dernières dates
- Tirez toutes les lignes de ces dates
Les deux sont possibles dans SQL, bien que le premier est beaucoup plus facile d'utiliser d'autres méthodes (SQL SAS ne sont pas très bon pour obtenir les "premières choses X").
Je suggère d'utiliser quelque chose comme PROC FREQ
ou PROC TABULATE
pour générer la liste des dates (juste un FREQ PROC sur la variable de date), vraiment tout proc vous êtes à l'aise avec - même PROC SORT
fonctionnerait (bien que ce soit probablement moins efficace) . Ensuite, une fois que vous avez cette table, limitez-la aux trois observations les plus hautes, puis vous pouvez l'utiliser dans une étape SQL pour rejoindre la table principale et filtrer ces trois dates - ou vous pouvez utiliser d'autres options, comme créer un format personnalisé ou tables de hachage ou tout ce qui fonctionne pour vous. 30 millions de lignes ne sont pas si nombreuses qu'une jointure SQL devrait être un problème, cependant, je pense.
Cela dépendra de la structure de votre base de données, qu'avez-vous déjà essayé? – ArturoAP
Ceci est extrêmement difficile à faire dans SAS SQL natif. Je suggère que vous utilisiez une étape de données, avec 'retain'. –
@GordonLinoff J'imagine qu'une étape de données ne serait pas très bonne là non plus, à moins que vous utilisiez une boucle DoW, ce qui semble être trop compliqué? – Joe