【问题标题】:How to pull the last N number of dates in SAS SQL如何在SAS SQL中提取最后N个日期
【发布时间】:2016-03-10 15:00:35
【问题描述】:

我正在处理一个大型数据集(3000 万行),我需要提取最近的三个日期(可能附加了不确定的行数),因此 03MAR2016 可能有 2 行 27FEB2016 可能有十个和25FEB2016 可能有 3。我怎么说“无论有多少行,都选择该集合中最后 X 个值内的所有内容”?

【问题讨论】:

  • 这取决于您的数据库结构,到目前为止您尝试过什么?
  • 这在原生 SAS SQL 中是极其困难的。我建议您使用数据步骤,retain
  • @GordonLinoff 我想数据步骤也不会很擅长这个,除非你使用 DoW 循环,这似乎有点矫枉过正?
  • @ArturoAP 我已经尝试按降序限制输出数量,但我可以得到一个有点笨拙的结果,它给了我比我需要的更多的数据,但得到我需要的实际结果证明是一个真正的挑战。如果我没有给出一个好的答案,也请原谅,我是新手

标签: sql sas proc proc-sql


【解决方案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;

【讨论】:

    【解决方案2】:

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

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

    这两种方法在 SQL 中都是可能的,尽管第一种方法使用其他方法更容易(SAS 的 SQL 不太擅长获得“第 X 件事”)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多