выберите пользователей, появляющихся как минимум раз в неделю в течение нескольких недель - PullRequest
0 голосов
/ 26 апреля 2011

Если у вас есть простая таблица, подобная следующей:

+---------+---------------------+
| user_id | activity_date       |
+---------+---------------------+
|   23672 | 2011-04-26 14:53:02 |
|   15021 | 2011-04-26 14:52:20 |
|   15021 | 2011-04-26 14:52:09 |
|   15021 | 2011-04-26 14:51:51 |
|   15021 | 2011-04-26 14:51:38 |
|    6241 | 2011-04-26 14:51:12 |
|     168 | 2011-04-26 14:51:12 |
...

Как вы можете выбрать набор идентификаторов user_ids, которые будут появляться не реже одного раза в неделю в течение последних 4 недель?

Ответы [ 2 ]

4 голосов
/ 26 апреля 2011
select user_id, 
sum(if(activity_date between now() - interval 1 week and now(),1,0)) as this_week,
sum(if(activity_date between now() - interval 2 week and now() - interval 1 week,1,0)) as last_week,
sum(if(activity_date between now() - interval 3 week and now() - interval 2 week,1,0)) as two_week_ago,
sum(if(activity_date between now() - interval 4 week and now() - interval 3 week,1,0)) as three_week_ago
from activities
where activity_date >= now() - interval 4 week 
group by user_id
having this_week > 0 and last_week > 0 and two_week_ago > 0 and three_week_ago > 0
0 голосов
/ 26 апреля 2011

При этом используется синтаксис Oracle, поэтому для MySql может потребоваться некоторая очистка, но вы можете использовать серию подзапросов, чтобы выбрать из таблицы, произошла ли активность в течение каждой из 4 недель, а затем подвести итоги по пользователю, а затем выберите только пользователей, которые имели активность> 0 в каждую неделю.

select user_id from 
{
  select user_id, SUM(in_week_0) sum_week_0,SUM(in_week_1) sum_week_1,SUM(in_week_2) sum_week_2,SUM(in_week_3) sum_week_3 from
  (
    select user_id, 
      activity_date, 
      CASE 
        WHEN activity_date < '01-MAY-11' AND activity_date >=  '24-APR-11' THEN 1
        ELSE 0
      END in_week_0,
      CASE 
        WHEN activity_date < '24-APR-11' AND activity_date >=  '17-APR-11' THEN 1
        ELSE 0
      END in_week_1,
      CASE 
        WHEN activity_date < '17-APR-11' AND activity_date >=  '10-APR-11' THEN 1
        ELSE 0
      END in_week_2,
      CASE 
        WHEN activity_date < '10-APR-11' AND activity_date >=  '03-APR-11' THEN 1
        ELSE 0
      END in_week_3
        from table
  )
  group by user_id
)
where sum_week_0 > 0 and sum_week_1 > 0 and sum_week_2 > 0 and sum_week_3 > 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...