如何使用滚动日期窗口计算SAS PROC SQL的不同值?
我有一个SAS数据集,如下所示:如何使用滚动日期窗口计算SAS PROC SQL的不同值?,sql,sas,Sql,Sas,我有一个SAS数据集,如下所示: MEMBER_ID VAR1 VAR2 DATE 1 12 5 01/04/2020 1 12 5 02/06/2020 1 16 5 04/14/2020 1 12 7 09/10/2020 2 10 5 02/20/2020
MEMBER_ID VAR1 VAR2 DATE
1 12 5 01/04/2020
1 12 5 02/06/2020
1 16 5 04/14/2020
1 12 7 09/10/2020
2 10 5 02/20/2020
2 10 6 04/20/2020
2 10 5 04/25/2020
2 10 5 05/15/2020
3 15 3 01/15/2020
3 16 4 01/25/2020
4 10 5 05/15/2020
5 11 7 03/03/2020
5 12 8 04/03/2020
5 13 9 05/03/2020
我的目标是计算VAR1
和VAR2
中的不同值,这些值按MEMBER\u ID
分组,滚动日期范围为180天。因此,如果第2行中的日期在成员1的第1行的180天之内,那么它们将被计算(清楚地)。我当前的代码如下所示:
PROC SQL;
CREATE TABLE WORK.WANT AS
SELECT t1.MEMBER_ID,
t1.VAR1,
t1.VAR2,
t1.DATE,
/* var1Count */
(COUNT(DISTINCT(t1.VAR1))) FORMAT=10. LABEL="var1Count " WHERE (t1 BETWEEN t1.DATE- 180 AND t1.DATE) AS var1Count ,
/* var2Count */
(COUNT(DISTINCT(t1.VAR2))) FORMAT=10. LABEL="var2Count " WHERE (t1 BETWEEN t1.DATE- 180 AND t1.DATE) AS var2Count ,
FROM WORK.HAVE t1
GROUP BY t1.MEMBER_ID
HAVING (CALCULATED var1Count ) >= 2 AND (CALCULATED var2Count ) >= 2
ORDER BY t1.MEMBER_ID,
t1.DATE;
QUIT;
但是,虽然我认为列计算中的
WHERE
语句可能适用于常规SQL代码,但它在这里给了我错误。还有其他想法吗?可能我需要在不同的SASdata
步骤中执行此COUNT(DISTINCT VAR)
,但我不确定(在这方面,我对SAS还是比较陌生的)。非常感谢您的帮助 我认为您需要在SAS中为此使用相关子查询:
SELECT h.* ,
(SELECT COUNT(DISTINCT h2.VAR1)
FROM WORK.HAVE h2
WHERE h2.MEMBER_ID = h.MEMBER_ID AND
h2.DATE BETWEEN h.DATE - 180 AND h.DATE
) as var1count,
(SELECT COUNT(DISTINCT h2.VAR2)
FROM WORK.HAVE h2
WHERE h2.MEMBER_ID = h.MEMBER_ID AND
h2.DATE BETWEEN h.DATE - 180 AND h.DATE
) as var2count
FROM WORK.HAVE h;
如果要根据计数进行筛选,可以使用子查询。是的,这似乎很有效。唯一的缺点是,对于我的大型数据集来说,它不是最快的。我正在处理大约11000000行。但在这一步之前,我可以过滤并清洗它,这将非常有帮助。非常感谢!