2016-03-10 1 views
2

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

+0

Cela dépendra de la structure de votre base de données, qu'avez-vous déjà essayé? – ArturoAP

+0

Ceci est extrêmement difficile à faire dans SAS SQL natif. Je suggère que vous utilisiez une étape de données, avec 'retain'. –

+0

@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

Répondre

1

Comme vous ne pouvez pas trier dans une vue en ligne/sous-requête, vous devrez diviser votre instruction SQL en deux parties:

  1. Trier la date décroissantes et obtenir les valeurs distinctes
  2. 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; 
1

Vous devez décomposer ceci en deux tâches.

  1. Déterminer quelles dates sont les trois dernières dates
  2. 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.