Написать рекурсивный sql запрос на 3 небольших таблицах

Цена договорная
09 сентября 2023, 17:51 • 11 откликов • 116 просмотров
Есть сущность Заказ. В ней есть гео координаты, тип заказа ( доставка jit или возврат в течении 30 дней ), тип изделия и дата доставки или крайняя дата возврата.

Есть сущность Склады с координатами и типами изделий, которые на нем могут храниться.

Есть тип авто для доставки принадлежащий складу ( с рабочей сменой на 11 часов и обязательным возвратом на свой склад в конце смены ) либо авто с биржи без ограничений для складского авто. У авто есть некая максимальная вместимость по кол-ву грузов.

Необходимо спланировать расписание доставки на следующий день.

Есть приоритет в использовании своих авто перед биржевым.

Насколько я понимаю, можно построить 1 рекурсивный sql запрос, который построит план по следующей эвристике.

Запрос выбирает все jit заказы на плановый день и все заказы последнего дня на возврат.
Далее он ищет ближайший к заказу склад с соответствием по типу допустимых к хранению изделий. Если склад находится на растоянии туда и обратно в течении менее равно 11 часов, то это заказ для своего авто. Если время больше, то это внешнее авто.


Далее строим рекурсивный запрос, запрос выше его первый проход. Очередным проходом смотрим ближайший возвратный груз по пути маршрута на не последнюю дату, соответствующий складу первого груза. Если доп путь к нему вписывается в 11 часов к своему авто или к 10% от общего пути для стороннего авто, то включаем его в маршрут. Если таких попутных грузов не найдено то выход из рекурсии для данного маршрута. При этом для jit маршрута рассматриваем пока только обратный путь для попутного груза. Для попутного груза путь это прямые между предыдущей и последующей точкой маршрута. Все пути считаем по прямой между гео точками. Есть константа - средняя скорость авто и время- константа на разгрузку/погрузку.
Задача не учебная. При желании можно дорабатывать запрос на учет дополнительных бизнес ограничений.

Прошу сразу указывать сумму начального интереса к написанию запроса