如何在SAS SQL中提取最后N个日期

时间:2016-03-10 15:00:35

标签: sql sas proc proc-sql

我正在处理大型数据集(3000万行),我需要提取最近的三个日期(可能有不确定的行数连接到它们),所以像03MAR2016可能有2行27FEB2016可能有10个25FEB2016可能有3.如何说“选择此集合中最后X个值的所有内容,无论有多少行”?

2 个答案:

答案 0 :(得分:1)

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

  1. 确定哪些日期是最后三个日期
  2. 从这些日期拉出所有行
  3. 两者都可以在SQL中使用,但第一种方法更容易使用其他方法(SAS的SQL不太擅长获取“第一件X事物”)。

    我建议使用像PROC FREQPROC TABULATE之类的东西来生成日期列表(只是日期变量上的PROC FREQ),真的是你感觉舒服的任何过程 - 甚至{{1会工作(虽然这可能效率较低)。然后,一旦有了该表,将其限制为三个最高的观察值,然后您可以在SQL步骤中使用它来连接到主表并过滤到这三个日期 - 或者您可以使用其他选项,例如创建自定义格式或哈希表或任何适合您的。但是,我认为,3000万行并不是一个SQL连接应该是一个问题。

答案 1 :(得分:1)

由于无法对内联视图/子查询进行排序,因此必须将SQL语句分为两部分:

  1. 对日期DESCENDING进行排序并获取不同的值
  2. 加入原始数据并限制为前3
  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;