假设我在SQL Server 2012中有一个表UserActivity,有两列:
我想每天计算30天内任何活动的不同用户数(我的每月活跃用户数)。 (所以我有一个30天的窗口,一次增加一天。如何有效地使用SQL Server中的窗口函数?
输出如下:
Date,NumberActiveUsersInPrevious30Days
01-01-2010,13567
01-02-2010,14780
01-03-2010,13490
01-04-2010,15231
01-05-2010,15321
01-06-2010,14513
...
答案 0 :(得分:1)
SQL Server不支持COUNT(DISTINCT ... ) OVER ()
或数字值30 PRECEDING
)与RANGE
我不打算强迫窗口函数执行此操作。由于COUNT(DISTINCT UserID)
的要求,它总是需要重新检查每个日期的整个30天窗口。
您可以为每个日期创建一个包含行的日历表,然后使用
SELECT C.Date,
NumberActiveUsersInPrevious30Days
FROM Calendar C
CROSS APPLY (SELECT COUNT(DISTINCT UserID)
FROM UserActivity
WHERE ActivityDateTime >= DATEADD(DAY, -30, C.[Date])
AND ActivityDateTime < C.[Date]) CA(NumberActiveUsersInPrevious30Days)
WHERE C.Date BETWEEN '2010-01-01' AND '2010-01-06'
答案 1 :(得分:0)