0

我需要创建一个表,其中包含从2011今天开始的每个日期以及每个用户 login_id,然后是用户在“the_date”之前的最后一个活动。即,如果这个人的最后一个活动在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

我目前正在使用一个ROW_NUMBER公式来根据日期对所有用户的活动进行排名,然后RANK = 1为每个 the_date 拉取并DATEDIFF为列进行计算3……每次都使事情变得非常低效(正如您可以想象的那样)。

是否有任何其他公式可以达到同样的目的?

4

1 回答 1

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';
于 2013-09-11T21:52:54.983 回答