如何在PROC SQL SAS中编写LAG()函数计算日期差

如何在PROC SQL SAS中编写LAG()函数计算日期差,sql,sas,Sql,Sas,我正试图在SQLSAS中编写一个代码来计算用户被看到的天数差 以下是原始数据的一个示例: USER DATE User1 20200516 User1 20200513 User1 20200501 User2 20200515 User2 20200511 USER DATE PREV_DATE DIFF User1 20200516 20200513 3 User1 20200513 2020050

我正试图在SQLSAS中编写一个代码来计算用户被看到的天数差

以下是原始数据的一个示例:

USER     DATE
User1    20200516
User1    20200513
User1    20200501
User2    20200515
User2    20200511
USER     DATE       PREV_DATE    DIFF
User1    20200516   20200513     3
User1    20200513   20200501     12
User2    20200515   20200511     4
如何编写滞后函数,使输出表如下所示:

USER     DATE
User1    20200516
User1    20200513
User1    20200501
User2    20200515
User2    20200511
USER     DATE       PREV_DATE    DIFF
User1    20200516   20200513     3
User1    20200513   20200501     12
User2    20200515   20200511     4

我不使用sas,所以请将我的回答作为使用滞后函数的提示,其他问题,如日期转换或计算差异由您决定。这是Postgres列中为避免冲突而重命名的解决方案:

with t(user_col,date_col) as (values
  ('User1', date '2020-05-16'),
  ('User1', date '2020-05-13'),
  ('User1', date '2020-05-01'),
  ('User2', date '2020-05-15'),
  ('User2', date '2020-05-11')
), lags as (
  select user_col
       , date_col
       , lag(date_col) over (partition by user_col order by date_col) as prev_date
  from t
)
select user_col, date_col, prev_date, date_col - prev_date as diff
from lags
where prev_date is not null
order by user_col asc, date_col desc

下一次,请直接以CTE with子句的形式提供示例输入。

SQL没有延迟烘焙的概念,SAS SQL也没有实现窗口函数或CTE

可以使用自反连接和SAS SQL自动重合并功能获得所需的结果集

data have;
attrib
  user length=$8
  date length= 8 format=yymmdd10. informat=yymmdd10.
;
input USER DATE;
datalines;
User1    20200516
User1    20200513
User1    20200501
User2    20200515
User2    20200511
;

proc sql;
  create table want as
  select 
    LEFT.user
  , LEFT.date
  , RIGHT.date as PREV_DATE
  , LEFT.date - RIGHT.date as DIFF
  from
    have as LEFT
  left join
    have as RIGHT
  on
    LEFT.user = RIGHT.user
  where
    LEFT.date > RIGHT.date
  group by
    LEFT.date
  having
    DIFF = MIN(DIFF)
  order by
    LEFT.user, LEFT.date desc, RIGHT.date desc
  ; 

这里是一个数据步方法

data have;
input USER $ DATE :anydtdte.;
format date yymmddn8.;
datalines;
User1 20200516
User1 20200513
User1 20200501
User2 20200515
User2 20200511
;

data want;
    merge have
          have(firstobs=2 rename=(date=prev_date user=_user));
    if user=_user;
    diff=date-prev_date;
    drop _:;
run;

在PROC-SQL中执行此操作是必需的吗?“在数据步骤中要容易得多。@draycut也可以在数据步骤中完成。感谢这最好在数据步骤中完成,除非您的数据在数据库中并且您使用的是远程连接。@GordonLinoff我正在SAS环境中运行代码。现在,我将研究每天将结果自动从SAS发送到本地ftp。谢谢:谢谢,托马斯。我对PSQL没有问题,因为它有一个滞后函数。谢谢你的意见:好的。我不理解你的问题,因为我不知道SAS中没有滞后函数的模拟。那么,使用自连接的解决方案是有意义的。谢谢您的回复。这是有道理的。我唯一不确定的部分是数据;因为我是从一个表格中读取Work.table_a,所以我要写代码:data have;设置WORK.Table_A obs=100;格式日期yymmddn8。;跑与您确认,我拥有的两个值是20200516和20200412。根据您共享的代码,该差异为104。但实际上,日期的差异应该是34。出于某种原因,我得到的日期是******。表中的数据值不是日期值,而是看起来像一个。这些值要么是数字,编码为日期值y*10000+m*100+yy,要么是表示日期值的字符串。如果是字符,日志将显示字符值已转换为。。。在执行日期算术之前,需要将日期变量中的值转换为SAS日期值。此表达式应适用于diff=inputcatsdate,yymmdd8.-inputcatsprev_日期,yymmdd8。;谢谢Richard,这很有道理,也解决了问题。谢谢Richard的回复。欢迎来到stackoverflow Khalid。帮助他人了解什么是什么,您可以在此处了解更多有关接受和标记有用答案的信息-