如何在 SAS SQL 中提取最后 N 个日期
How to pull the last N number of dates in SAS SQL
我正在处理一个大型数据集(3000 万行),我需要提取最近的三个日期(可能附加了不确定数量的行)所以像 03MAR2016 可能有 2 行 27FEB2016 可能有10 和 25FEB2016 可能有 3。我怎么说 "Select everything that falls within the last X number of values in this set regardless of how many rows there are"?
您需要将其分解为两个任务。
- 判断哪些日期是最后三个日期
- 从这些日期中提取所有行
两者在 SQL 中都是可能的,尽管第一种使用其他方法更容易(SAS 的 SQL 不太擅长获得 "first X things")。
我建议使用 PROC FREQ
或 PROC TABULATE
之类的东西来生成日期列表(只是日期变量上的 PROC FREQ),实际上任何你喜欢的过程 table 与 - 即使 PROC SORT
也可以工作(尽管这可能效率较低)。然后一旦你有了 table,将其限制为三个最高观察值,然后你可以在 SQL 步骤中使用它加入主要 table 并过滤到这三个日期 -或者您可以使用其他选项,例如创建自定义格式或散列 tables 或任何适合您的选项。不过,我认为 3000 万行并没有多到 SQL 连接应该成为问题。
由于您无法在线排序 view/subquery 您必须将 SQL 语句分成两部分:
- 对日期进行降序排序并获取不同的值
- 加入原始数据并限制为前 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;
我正在处理一个大型数据集(3000 万行),我需要提取最近的三个日期(可能附加了不确定数量的行)所以像 03MAR2016 可能有 2 行 27FEB2016 可能有10 和 25FEB2016 可能有 3。我怎么说 "Select everything that falls within the last X number of values in this set regardless of how many rows there are"?
您需要将其分解为两个任务。
- 判断哪些日期是最后三个日期
- 从这些日期中提取所有行
两者在 SQL 中都是可能的,尽管第一种使用其他方法更容易(SAS 的 SQL 不太擅长获得 "first X things")。
我建议使用 PROC FREQ
或 PROC TABULATE
之类的东西来生成日期列表(只是日期变量上的 PROC FREQ),实际上任何你喜欢的过程 table 与 - 即使 PROC SORT
也可以工作(尽管这可能效率较低)。然后一旦你有了 table,将其限制为三个最高观察值,然后你可以在 SQL 步骤中使用它加入主要 table 并过滤到这三个日期 -或者您可以使用其他选项,例如创建自定义格式或散列 tables 或任何适合您的选项。不过,我认为 3000 万行并没有多到 SQL 连接应该成为问题。
由于您无法在线排序 view/subquery 您必须将 SQL 语句分成两部分:
- 对日期进行降序排序并获取不同的值
- 加入原始数据并限制为前 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;