如何在 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"?

您需要将其分解为两个任务。

  1. 判断哪些日期是最后三个日期
  2. 从这些日期中提取所有行

两者在 SQL 中都是可能的,尽管第一种使用其他方法更容易(SAS 的 SQL 不太擅长获得 "first X things")。

我建议使用 PROC FREQPROC TABULATE 之类的东西来生成日期列表(只是日期变量上的 PROC FREQ),实际上任何你喜欢的过程 table 与 - 即使 PROC SORT 也可以工作(尽管这可能效率较低)。然后一旦你有了 table,将其限制为三个最高观察值,然后你可以在 SQL 步骤中使用它加入主要 table 并过滤到这三个日期 -或者您可以使用其他选项,例如创建自定义格式或散列 tables 或任何适合您的选项。不过,我认为 3000 万行并没有多到 SQL 连接应该成为问题。

由于您无法在线排序 view/subquery 您必须将 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;