2016-03-10 30 views
2

我正在處理一個大型數據集(3000萬行),我需要拉最近的三個日期(可能有不確定數量的行連接到它們)所以就像03MAR2016可能有2行27FEB2016可能有10行,25FEB2016可能有3行。我怎麼說「選擇所有屬於該集合中最後X個值的所有內容,而不管有多少行」?如何拉出SAS SQL中最後N個日期數

+0

它將取決於您的數據庫結構,到目前爲止您嘗試過什麼? – ArturoAP

+0

這在原生SAS SQL中非常困難。我建議你使用數據步驟,用'retain'。 –

+0

@GordonLinoff我想象一個數據步驟不會很好,除非你使用DoW循環,這看起來像是過度殺傷? – Joe

回答

1

正如你不能在在線模式排序/子查詢,你將有兩個部分來分割你的SQL語句:

  1. 排序日期倒序排列,並獲得不同的值
  2. 加入回原始數據和限制在前3

但是如前所述,SQL不擅長這種操作。

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

您需要將其分解爲兩個任務。

  1. 確定哪些日期是最後三個日期
  2. 拉離這些日期的所有行

在SQL兩者都是可能的,但首先是更容易使用其他方法(SAS的SQL不非常擅長獲得「第一個X的東西」)。

我會建議使用像PROC FREQPROC TABULATE東西生成日期列表(只是日期變量PROC FREQ),任何真正的PROC你舒服 - 即使PROC SORT將工作(儘管這可能是低效率) 。然後,一旦擁有該表,將其限制爲三個最高的觀察值,然後您可以在SQL步驟中使用它來加入主表並篩選這三個日期 - 或者您可以使用其他選項,如創建自定義格式或散列表或任何適合你的東西。但是,我認爲,3000萬行不是那麼多,SQL連接應該成爲問題。