SQL Server — запрос для возврата неконфликтных расписаний

#sql-server

#sql-server

Вопрос:

Я пытаюсь написать команду для создания расписаний для сотрудников с различными рабочими адресами. Существует ряд местоположений, каждое из которых должно быть посещено один раз (одним сотрудником) в течение определенного периода.

Для начала я создал всего две таблицы: address_availability (столбцы avail_date и address) и employee_availability (столбцы avail_date и name)

Чтобы получить список всех возможных мест размещения, я просто выбираю адрес и имена сотрудников из двух таблиц и объединяю их по дате. В качестве примера вывода я получаю

 London, Thomas, 27/05/2019
London, Thomas, 28/05/2019
Glasgow, Thomas, 27/05/2019
London, Mary, 27/05/2019
Glasgow, Mary, 27/05/2019
  

Мне нужно сделать так, чтобы не было конфликтов в расписании, т. Е. если Томасу предложено вылететь в Лондон 27-го, он не может быть в Глазго 27-го.

Я также хотел бы, чтобы команда выдавала максимум 5 результатов на сотрудника и не предлагала двух сотрудников на одно и то же место в одну и ту же дату.

Я не совсем уверен, что использую правильный инструмент для этой работы. Выполнимо ли это в SQL?

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

1. Я не уверен, что SQL Server является подходящим инструментом для такого рода работы. Обычно с этим справляется приложение; поскольку это будет (очень вероятно) итеративный процесс, который после подтверждения будет записан обратно в базу данных.

2. Идея заключалась в том, чтобы просто перевести выходные данные в электронную таблицу. Попытки реализовать это в приложении на самом деле не оправданы, учитывая, как часто оно будет использоваться, поэтому я мог бы просто вернуться к выполнению этого вручную, если нет какого-либо готового приложения, которое обрабатывает такого рода вещи.

3. Жаль, я бы с удовольствием посмотрел, что мог бы создать здесь один из твердолобых (100k ) … 🙂 Я думаю, что это отличный вопрос в любом случае.

4. Даже просто ради любопытства или для будущего приложения, где требуется неконфликтный результат, было бы интересно

Ответ №1:

Если вы готовы перенести это в электронную таблицу, я бы использовал СВОДНЫЙ запрос https://learn.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-2017 ) для получения данных в формате

 LOCATION     TIME        Thomas  Mary  

London       27/05/2019  1       1
Glasgow      27/05/2019  1       1

London       28/05/2019  1       0
  

Итак, из приведенной выше таблицы вы можете видеть, что 27-го числа Мэри и Томас могут оба выполнять либо то, либо другое, но 28-го числа доступен только Томас.

Что касается создания списка, вы можете использовать этот скрипт дальше, выполнив цикл, и там, где есть только один вариант, взяв его (а затем удалив этого человека на этот день) и выполнив цикл снова. В зависимости от сложности вы скоро достигнете пределов, когда у вас есть 2 варианта, и вам просто нужно выбрать один.

Это также при том понимании, что всегда есть решение, вы не разместили полные требования и т.д., Чтобы предложить это.