powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Распределить задачи на пользователей
7 сообщений из 7, страница 1 из 1
Распределить задачи на пользователей
    #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
Распределить задачи на пользователей
    #39909019
igor.n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверно на форуме есть решение, но я не могу найти
...
Рейтинг: 0 / 0
Распределить задачи на пользователей
    #39909064
igor.n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
возможно лучше это сделать на plpgsql ? проблема что это будет раз в 1 сек срабатывать
...
Рейтинг: 0 / 0
Распределить задачи на пользователей
    #39909216
PinkCat.000003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igor.n,

авторэто будет раз в 1 сек срабатывать
Ээээ... Ты собираешься пересчитывать или только проверять необходимость пересчета? Последняя у тебя только при изменении исходных данных...
...
Рейтинг: 0 / 0
Распределить задачи на пользователей
    #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
Распределить задачи на пользователей
    #39909237
igor.n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините. Плохо описал задачу.
Есть таблица tickets, она совсем маленькая 1-1000 записей, это задачи которые система распределила и ждет пока, будет свободный пользователь что бы обработать этот тикет, например поступил входящий звонок или смс. Здесь не все поля, по сути мне нужно сделать апдейт tickets и заполнить user_activity пользователем который попал в распределение.
Выборка tickets с условием user_activity isnull, а поле last_user_activity это чтобы соединить пользователя (если есть) с большем приоритетом. Это по сути распределитель задач на пользователей которые сейчас свободные.
...
Рейтинг: 0 / 0
Распределить задачи на пользователей
    #39909245
igor.n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor Nevsky,

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

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


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