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すべてのユーザーとすべての日付 (必ずしもすべての組み合わせではありませんが)を含むテーブルがあるとします。datediffとウィンドウ関数の両方があるため、SQL Server 構文も使用しています。

次の例では、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 に答える