如何在PROC SQL SAS中编写LAG()函数计算日期差
我正试图在SQLSAS中编写一个代码来计算用户被看到的天数差 以下是原始数据的一个示例:如何在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
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。帮助他人了解什么是什么,您可以在此处了解更多有关接受和标记有用答案的信息-