Как распределить случайные задания по списку агентов в Mysql?

#mysql

#mysql

Вопрос:

Я хочу написать скрипт, который позволит мне распределять случайные задания между 7 разными агентами. Ниже приведены мои 2 таблицы:

  DROP TABLE IF EXISTS jobs;

CREATE TABLE `Jobs` (
     `Job_id` SERIAL PRIMARY KEY,
     `Start_Date` date DEFAULT NULL,
     `End_Date` date DEFAULT NULL,
     `Ref_no` int NOT NULL
    ) ;

INSERT INTO Jobs(Job_id,Start_Date, End_Date, Ref_no) VALUES
(1,'2018-09-01','2021-08-31',123456789),
(2,'2019-10-03','2020-10-02',987654321),
(3,'2020-11-01','2021-10-02',543210123),
(4,'2020-12-01','2022-11-30',481216181),
(5,'2018-04-01','2020-03-31',246810121),
(6,'2019-05-30','2020-05-29',369121518),
(7,'2019-11-01','2020-10-31',581114179);

DROP TABLE IF EXISTS agents;

CREATE TABLE `Agents` (
`Agent_id` SERIAL PRIMARY KEY,
`Agent_Name` varchar(255) NOT NULL UNIQUE
) ;

INSERT INTO Agents(Agent_id, Agent_Name) VALUES
(1,'Humpty'),
(2,'Mickey'),
(3,'Minnie'),
(4,'Daffy'),
(5,'Ellie'),
(6,'Jack'),
(7,'Jill');
  

Теперь я хотел бы написать скрипт, который случайным образом распределял бы задания по 7 агентам. Был бы очень признателен, если бы кто-нибудь мог посоветовать, как я мог бы начать это.

Заранее спасибо.

Комментарии:

1. SELECT * FROM jobs ORDER BY RAND() — и, пожалуйста, протестируйте весь код перед публикацией.

2. Что вы пробовали до сих пор? Какой «скрипт» вы ищете — что-то, работающее с чистыми запросами MySQL?

3. Очень удобно, что у вас есть 7 заданий и 7 агентов — действительно ли это отражает вашу проблему?

4. Привет, P Salmon, приведенный выше пример набора данных, данные, которые будут разделены, будут равным количеством по 7 агентам, поэтому агентов будет нужное количество. Объем данных, когда я выполняю это против данных, когда они поступают, будет меняться.

Ответ №1:

В MySQL 8.x вы можете комбинировать RAND() с ROW_NUMBER() , чтобы связать случайные строки. Например:

 select *  
from (
  select *, row_number() over(order by rand()) as rn
  from `Jobs`
) j
join (
  select *, row_number() over(order by rand()) as rn
  from `Agents`
) a on j.rn = a.rn
  

Смотрите Пример выполнения в DB Fiddle.

Комментарии:

1. Спасибо, ребята, попробую ответы и отвечу.

Ответ №2:

Вот метод для версий MySQL до 8.0…

 SELECT x.*
     , MOD(@i:=@i 1,7)   1 i -- where '7' is the number of agents.
  FROM
     ( SELECT j.*
         FROM jobs j
        ORDER
           BY RAND()
     ) x
  JOIN (SELECT @i := 0) vars
 ORDER
    BY i;
  

Пример вывода:

  -------- ------------ ------------ ----------- ------ 
| Job_id | Start_Date | End_Date   | Ref_no    | i    |
 -------- ------------ ------------ ----------- ------ 
|      5 | 2018-04-01 | 2020-03-31 | 246810121 |    1 |
|      3 | 2020-11-01 | 2021-10-02 | 543210123 |    2 |
|      1 | 2018-09-01 | 2021-08-31 | 123456789 |    3 |
|      7 | 2019-11-01 | 2020-10-31 | 581114179 |    4 |
|      4 | 2020-12-01 | 2022-11-30 | 481216181 |    5 |
|      6 | 2019-05-30 | 2020-05-29 | 369121518 |    6 |
|      2 | 2019-10-03 | 2020-10-02 | 987654321 |    7 |
 -------- ------------ ------------ ----------- ------