我正在处理大型数据集(3000万行),我需要提取最近的三个日期(可能有不确定的行数连接到它们),所以像03MAR2016可能有2行27FEB2016可能有10个25FEB2016可能有3.如何说“选择此集合中最后X个值的所有内容,无论有多少行”?
答案 0 :(得分:1)
您需要将其分解为两个任务。
两者都可以在SQL中使用,但第一种方法更容易使用其他方法(SAS的SQL不太擅长获取“第一件X事物”)。
我建议使用像PROC FREQ
或PROC TABULATE
之类的东西来生成日期列表(只是日期变量上的PROC FREQ),真的是你感觉舒服的任何过程 - 甚至{{1会工作(虽然这可能效率较低)。然后,一旦有了该表,将其限制为三个最高的观察值,然后您可以在SQL步骤中使用它来连接到主表并过滤到这三个日期 - 或者您可以使用其他选项,例如创建自定义格式或哈希表或任何适合您的。但是,我认为,3000万行并不是一个SQL连接应该是一个问题。
答案 1 :(得分:1)
由于无法对内联视图/子查询进行排序,因此必须将SQL语句分为两部分:
但如前所述,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;