Peewee Показать элемент, который больше всего отображается в таблице ORM (расчет) - PullRequest
0 голосов
/ 30 января 2020

У меня есть две таблицы в моей базе данных:

Таблица 1: Пользователи

userid   name   department
123      Sam    Management
124      Joe    Employee

Таблица 2: Активность

userid activity
123    login
123    browse
123    browse
123    browse
123    logout
124    signup

Я хотел бы иметь 'Резюме 'таблица, которая может дать мне много информации относительно этих двух таблиц

userid   name   department   activityCount   topActivity
123      Sam    Management   5               Browse
124      Joe    Employee     1               Signup

Есть много способов получить эти результаты, но как найти правильный путь?

Я использую peewee, поэтому, чтобы быть более понятным:

1) Как подсчитать количество событий для определенного userId и добавить его в качестве значения в новую таблицу / столбец ( Нечто похожее на pandas df.group_by(userid).count())

2) Как получить наиболее перечисленный объект для идентификатора пользователя и добавить его в качестве значения в новую таблицу / столбец

1 Ответ

0 голосов
/ 30 января 2020

Один из способов сделать это - объединить таблицу users с агрегированным запросом, который подсчитывает и ранжирует действия для пользователя:

select 
    u.userid,
    u.name,
    u.department,
    sum(activity_count) activity_count,
    max(case when a.rn = 1 then a.activity end) top_activity
from users u
inner join (
    select 
        activity, 
        userid, 
        count(*) activity_count ,
        row_number() over(partition by userid order by count(*) desc) rn
    from activity
    group by activity, userid
) a on a.userid = u.userid
group by u.userid, u.name, u.department

Демонстрация на DB Fiddle :

userid | name | department | activity_count | top_activity
:----- | :--- | :--------- | :------------- | :-----------
123    | Sam  | Management | 5              | browse      
124    | Joe  | Employee   | 1              | signup      
...