0

ユーザー ログインのテーブルがあり、サイトに 5 日間で 3 回以上ログインしたユーザーを見つけたいと考えています。

たとえば、私のテーブルは次のとおりです。

id | user_id | login_date 
---+---------+--------------
 1 |    10   | 10.1.2014 00:00
 2 |    10   | 11.1.2014 10:10
 3 |    12   | 11.1.2014 11:00
 4 |    10   | 11.1.2014 12:00
 5 |    12   | 12.1.2014 00:00
 6 |    10   | 13.1.2014 10:00
 7 |    12   | 18.1.2014 00:00
 8 |    12   | 22.1.2014 09:00

この例のテーブルでは、5 日間で 3 回以上ログインしたため、user_id 10 を選択します。

そのために私を助けていただけますか?

編集:データベースがSQL Server 2008であることを忘れていました

4

3 に答える 3

1

SQL Server 2012+ を使用している場合は、LEADウィンドウ関数を使用して、連続する 3 つのレコード間の日数の差を計算できます。

select distinct USER_ID
from (
select USER_ID, 
       datediff(d, login_date,
                   LEAD(login_date, 2) OVER (PARTITION BY user_id 
                                             ORDER BY login_date)) as diffDates
from users ) t
where t.diffDates <= 5

次にUSER_IDs、日数差が 5 以下のものを選択します。

SQL フィドルのデモ

SQL Server 2008 または 2005 を使用している場合は、関数ROW_NUMBERをシミュレートするために自己結合と組み合わせて使用​​できます。LEAD

;WITH CTE AS (
   SELECT id, user_id, login_date,
          ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn
   FROM users
) 
SELECT DISTINCT user_id
FROM (             
   SELECT c1.user_id, 
          DATEDIFF(d, c1.login_date, c2.login_date) AS diffInDays
   FROM CTE AS c1
   INNER JOIN CTE AS c2 ON c1.user_id = c2.user_id AND c1.rn = c2.rn - 2
  ) t
WHERE t.diffInDays <= 5

diffInDays上記のクエリの は、基本的に、ユーザーが 3 回連続してログインする間のローリング日数の差です。

SQL フィドルのデモ

于 2015-04-20T14:33:52.473 に答える