如何在proc sql sas中编写lag()函数计算日期差

osh3o9ms  于 2021-08-09  发布在  Java
关注(0)|答案(3)|浏览(606)

我试图在SQLSAS中编写一个代码来计算用户被看到的天数差。
原始数据示例如下:

  1. USER DATE
  2. User1 20200516
  3. User1 20200513
  4. User1 20200501
  5. User2 20200515
  6. User2 20200511

如何编写lag()函数,使输出表如下所示:

  1. USER DATE PREV_DATE DIFF
  2. User1 20200516 20200513 3
  3. User1 20200513 20200501 12
  4. User2 20200515 20200511 4
of1yzvn4

of1yzvn41#

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

  1. with t(user_col,date_col) as (values
  2. ('User1', date '2020-05-16'),
  3. ('User1', date '2020-05-13'),
  4. ('User1', date '2020-05-01'),
  5. ('User2', date '2020-05-15'),
  6. ('User2', date '2020-05-11')
  7. ), lags as (
  8. select user_col
  9. , date_col
  10. , lag(date_col) over (partition by user_col order by date_col) as prev_date
  11. from t
  12. )
  13. select user_col, date_col, prev_date, date_col - prev_date as diff
  14. from lags
  15. where prev_date is not null
  16. order by user_col asc, date_col desc

在这儿摆弄。
下一次请直接以cte(with子句)的形式提供示例输入。

展开查看全部
esbemjvw

esbemjvw2#

sql没有延迟烘焙的概念,sas-sql不实现窗口函数或cte
使用自反连接和sas-sql自动重合并功能可以获得所需的结果集。

  1. data have;
  2. attrib
  3. user length=$8
  4. date length= 8 format=yymmdd10. informat=yymmdd10.
  5. ;
  6. input USER DATE;
  7. datalines;
  8. User1 20200516
  9. User1 20200513
  10. User1 20200501
  11. User2 20200515
  12. User2 20200511
  13. ;
  14. proc sql;
  15. create table want as
  16. select
  17. LEFT.user
  18. , LEFT.date
  19. , RIGHT.date as PREV_DATE
  20. , LEFT.date - RIGHT.date as DIFF
  21. from
  22. have as LEFT
  23. left join
  24. have as RIGHT
  25. on
  26. LEFT.user = RIGHT.user
  27. where
  28. LEFT.date > RIGHT.date
  29. group by
  30. LEFT.date
  31. having
  32. DIFF = MIN(DIFF)
  33. order by
  34. LEFT.user, LEFT.date desc, RIGHT.date desc
  35. ;
展开查看全部
jjhzyzn0

jjhzyzn03#

这是一种数据步方法

  1. data have;
  2. input USER $ DATE :anydtdte.;
  3. format date yymmddn8.;
  4. datalines;
  5. User1 20200516
  6. User1 20200513
  7. User1 20200501
  8. User2 20200515
  9. User2 20200511
  10. ;
  11. data want;
  12. merge have
  13. have(firstobs=2 rename=(date=prev_date user=_user));
  14. if user=_user;
  15. diff=date-prev_date;
  16. drop _:;
  17. run;
展开查看全部

相关问题