Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Распределить задачи на пользователей / 7 сообщений из 7, страница 1 из 1
27.12.2019, 13:59
    #39909003
igor.n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределить задачи на пользователей
Здравствуйте, помогите, пожалуйста, никак не могу сообразить как назначить пользователям задачи, так, что бы одному пользователю одна задача. Есть 3 таблицы:
user_group (id, priority) - приоритет групп
users (group_id, user_id, lvl) - пользователь может быть в разных user_group
tickets(id, group_id, position, last_user_activity) - last_user_activity последний пользователь который работал с тикетом (если есть такой пользователь нужно как то соединить с тикетом )

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
with users as  (
    select 1 as group_id, 1 as user_id, 10 as lvl
    union all
    select 1 as group_id, 2 as user_id, 8 as lvl
    union all
    select 1 as group_id, 3 as user_id, 0 as lvl

    union all
    select 2 as group_id, 2 as user_id, 100500 as lvl
    union all
    select 2 as group_id, 3 as user_id, 5 as lvl
),
 user_group as (
     select 1 as id, 10 priority
     union all
     select 2 as id, 1 priority
 ),
 tickets as (
     select 1 as id, 1 as group_id, 1 as position, null::int4 last_user_activity
     union all
     select 2 as id, 1 as group_id, 2 as position, null last_user_activity
     union all
     select 3 as id, 1 as group_id, 3 as position, null last_user_activity

     union all
     select 4 as id, 2 as group_id, 4 as position, 100500 last_user_activity
     union all
     select 5 as id, 2 as group_id, 5 as position, 3 last_user_activity
 )
select *
from (
    select tickets.id, users.user_id,
        row_number() over (
            partition by user_id
            order by
                user_group.priority desc,
                case when tickets.last_user_activity = users.user_id then 1000 * tickets.position else tickets.position end desc,
                tickets.position
            ) rn, *
    from tickets,
         users
        inner join user_group on user_group.id = users.group_id
    where tickets.group_id = users.group_id
) t
where t.rn = 1



Нужно получить
ticket_id user_id 1 1 2 2 5 3 - Сортировка: сначала всех пользователей которые работали с тикетом, потом по приоритету тикета и групп.
Буду рад любым предложениям. Версия PG 12.0
...
Рейтинг: 0 / 0
27.12.2019, 14:11
    #39909019
igor.n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределить задачи на пользователей
Наверно на форуме есть решение, но я не могу найти
...
Рейтинг: 0 / 0
27.12.2019, 14:45
    #39909064
igor.n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределить задачи на пользователей
возможно лучше это сделать на plpgsql ? проблема что это будет раз в 1 сек срабатывать
...
Рейтинг: 0 / 0
27.12.2019, 17:28
    #39909216
PinkCat.000003
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределить задачи на пользователей
igor.n,

авторэто будет раз в 1 сек срабатывать
Ээээ... Ты собираешься пересчитывать или только проверять необходимость пересчета? Последняя у тебя только при изменении исходных данных...
...
Рейтинг: 0 / 0
27.12.2019, 17:47
    #39909234
Victor Nevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределить задачи на пользователей
не вникал,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
with users as  (
    select 1 as group_id, 1 as user_id, 10 as lvl
    union all
    select 1 as group_id, 2 as user_id, 8 as lvl
    union all
    select 1 as group_id, 3 as user_id, 0 as lvl
    union all
    select 2 as group_id, 2 as user_id, 100500 as lvl
    union all
    select 2 as group_id, 3 as user_id, 5 as lvl
),
 user_group as (
     select 1 as id, 10 priority
     union all
     select 2 as id, 1 priority
 ),
 tickets as (
     select 1 as id, 1 as group_id, 1 as position, null::int4 last_user_activity
     union all
     select 2 as id, 1 as group_id, 2 as position, null last_user_activity
     union all
     select 3 as id, 1 as group_id, 3 as position, null last_user_activity
     union all
     select 4 as id, 2 as group_id, 4 as position, 100500 last_user_activity
     union all
     select 5 as id, 2 as group_id, 5 as position, 3 last_user_activity
 )
select distinct on (users.user_id) tickets.id, user_id
 from tickets
 join users on tickets.group_id = users.group_id
 join user_group on user_group.id = users.group_id
order by users.user_id,
         case when tickets.last_user_activity = users.user_id then 0 else 1 end,
         user_group.priority desc;


 id | user_id
----+---------
  1 |       1
  2 |       2
  5 |       3
...
Рейтинг: 0 / 0
27.12.2019, 17:52
    #39909237
igor.n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределить задачи на пользователей
Извините. Плохо описал задачу.
Есть таблица tickets, она совсем маленькая 1-1000 записей, это задачи которые система распределила и ждет пока, будет свободный пользователь что бы обработать этот тикет, например поступил входящий звонок или смс. Здесь не все поля, по сути мне нужно сделать апдейт tickets и заполнить user_activity пользователем который попал в распределение.
Выборка tickets с условием user_activity isnull, а поле last_user_activity это чтобы соединить пользователя (если есть) с большем приоритетом. Это по сути распределитель задач на пользователей которые сейчас свободные.
...
Рейтинг: 0 / 0
27.12.2019, 17:57
    #39909245
igor.n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределить задачи на пользователей
Victor Nevsky,

Спасибо за ответ. Нужно что бы тикеты не пересекались на пользователей.

Если tickets.id = 5 сделать last_user_activity = null, тогда получиться что 3 тикет уйдет на 2, 3 пользователя.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Распределить задачи на пользователей / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]