Циклическое задание SQL - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь определить циклическое назначение задач пользователям.

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

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

Текущая настройка:

#newtasks
taskname:
task6
task7

назначенные задания:

userid task   last_update_date
11     task1  2018-05-29 15:30:17.410
22     task2  2018-05-30 15:30:17.410
22     task3  2018-05-31 15:30:17.410
33     task4  2018-06-01 15:30:17.410

Что я хочу видеть, ID пользователя 22 не должен получать задачу, поскольку у них есть 2 задачи:

#assignedtasks:

userid task   last_update_date
11     task1  2018-05-29 15:30:17.410
11     task6  2018-06-01 16:30:17.410
22     task2  2018-05-30 15:30:17.410
22     task3  2018-05-31 15:30:17.410
33     task4  2018-06-01 15:30:17.410
33     task7  2018-06-01 16:30:17.410

Код для создания таблиц:

IF Object_id ('TEMPDB..#newtasks') IS NOT NULL
DROP TABLE #newtasks

CREATE TABLE #newtasks
(
taskname VARCHAR(8)
)

INSERT INTO #newtasks
VALUES ('task6')
INSERT INTO #newtasks
VALUES ('task7')

SELECT * from #newtasks

IF Object_id ('TEMPDB..#assignedtasks') IS NOT NULL
DROP TABLE #assignedtasks

CREATE TABLE #assignedtasks
(
userid  INT,
task    VARCHAR(8),
last_update_date DATETIME
)

INSERT INTO #assignedtasks
VALUES ('11','task1',getdate()-4)
INSERT INTO #assignedtasks
VALUES ('22','task2',getdate()-3)
INSERT INTO #assignedtasks
VALUES ('22','task3',getdate()-2)
INSERT INTO #assignedtasks
VALUES ('33','task4',getdate()-1)

SELECT * FROM #assignedtasks

1 Ответ

0 голосов
/ 02 июня 2018

Может быть, вы хотите присоединиться к порядку номеров строк по самым старым last_update_date для пользователей и taskname для задач (поскольку нет другого столбца для заказа по).Чтобы исключить пользователей, у которых уже есть две задачи, используйте HAVING count(*) = 1.

INSERT INTO assignedtasks
            (userid,
             task,
             last_update_date)
            SELECT at.userid,
                   nt.taskname,
                   getdate()
                   FROM (SELECT at.userid,
                                ROW_NUMBER() OVER (ORDER BY max(at.last_update_date)) #
                                FROM assignedtasks at
                                GROUP BY at.userid
                                HAVING count(*) = 1) at
                        INNER JOIN (SELECT nt.taskname,
                                           ROW_NUMBER() OVER (ORDER BY nt.taskname) #
                                           FROM newtasks nt) nt
                                   ON nt.# = at.#;

SQL Fiddle

Все еще думая, что таблица пользователей отсутствует.Что если пользователь выполнил все свои задачи?

...