我需要创建一个包含2011
的每个日期的表 - 今天和每个用户login_id,然后是用户在“the_date”之前的最后一个活动..即,此人的最后一个活动是否在{{ 1}}
1/2/13
我目前正在使用the_date | login_id | days_since_last_activity
1/2/13 1 0
1/3/13 2 1
1/4/13 3 2
公式根据日期对所有用户的活动进行排名,然后为每个the_date提取ROW_NUMBER
并对列{{进行RANK = 1
计算1}} ...每次都会让事情变得非常低效(正如你想象的那样)。
是否有任何其他公式可能起到同样的作用?
答案 0 :(得分:1)
假设您有一个表logins
,其中包含所有用户和所有日期(尽管不一定是所有组合)。我也使用SQL Server语法,因为它同时具有datediff
和窗口函数。
以下使用from
子句获取日期和用户的所有组合。然后,它使用相关子查询来获取给定日期之前的最新活动日期:
select d.the_date, l.login_id,
datediff(day,
(select max(the_date)
from logins l2
where l2.login_id = l.login_id and
l2.the_date <= l.the_date
), the_date
) as days_since_last_activity
from (select distinct the_date from logins) d cross join
(select distinct login_id from logins) l
where d.the_date >= '2011-01-01';