寻找更好的公式来对SQL中的用户活动进行排名

时间:2013-09-11 21:21:32

标签: sql

我需要创建一个包含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}} ...每次都会让事情变得非常低效(正如你想象的那样)。

是否有任何其他公式可能起到同样的作用?

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';