@Preci

Как подсчитать активность пользователя за промежуток времени по данным из БД?

Здравствуйте!

На моем сайте имеется система уровней для пользователей, который они могут повышать путем активности: публикация сообщений, тем, оценки и т.п.

Я хочу подсчитать самых активных пользователей за неделю - те, чей опыт максимально вырос за последние 7 дней.

1 раз в день для каждого пользователя заносятся данные о его опыте в таблицу user_exp которая имеет вид:

user_id | data | exp
...
1 | 03-03-2016| 1238
1 | 02-03-2016| 1218
2 | 03-03-2016| 552
2 | 02-03-2016| 523
...
т.е. в таблице есть информация о опыте пользователя за каждый день

Вопрос: как мне посчитать у какого пользователя на сколько прирос опыт за промежуток времени (неделя) и получить ID пользователей с максимальным приростом?

Почему я записываю данные о опыте за каждый день, а не 2 раза в неделю (в начале и в конце, что бы сравнить)? Потому что я хочу что бы пользователь мог зайти на страницу и посмотреть текущий ТОП: кто сколько набрал за последние сутки, за 2ое суток, и т.п.

p.s. так же я выслушал бы предложения относительно структуры таблицы, может быть я делаю что-то не так и можно проще...
  • Вопрос задан
  • 688 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
select curr.user_id, (curr.exp - coalesce(lastr.exp, 0)) as diff
from user_exp curr
left join user_exp lastr ON curr.user_id = lastr.user_id and lastr.date = CURRENT_DATE - interval '1week'
where  curr.date = CURRENT_DATE
order by diff desc

По индексу по user_id & date будет внятно работать джойн, индекс по date для начальной таблицы. Но сортировка всех юзеров по вычисляемому полю - это может быть болезненно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы