Гуру тест про порядок элементов в иерархии
Предлагаю вашему вниманию задачу, которую задавал своим коллегам 1сникам. Но они не справились. Возможно, ваши познания в SQL лучше, чем их.
Есть некоторый иерархический справочник, иерархия элементов. У каждого элемента есть поле «Позиция» (может быть дробным и отрицательным). Элементы в пределах одного родителя должны быть пронумерованы в поле «Позиция» по порядку с единицы с шагом один: 1, 2, … N
Таким образом, например, чтобы поменять порядок элементов с позициями 2 и 3 мы можем элементу с позицией 2 установить позицию 2,5 и вызвать процедуру исправления порядка.
Не буду давать подсказки и наводящие мысли, просто жду от вас идей оптимальной реализации алгоритма проверки и изменения порядка. Это гуру-тест, который, кстати, можно давать на собеседованиях.
Пример: в группе с названием Алкоголь есть элементы с позициями:
Пиво 1
Водка 2
Эль 3
Я меняю:
Пиво 2.5
Водка 2
Эль 3
Система должна пересчитать по всей номенклатуре и сделать:
Водка 1
Пиво 2
Эль 3
Причем найти отклонения и сделать изменения максимально эффективно.
По сути можно упростить вопрос — как запросом найти группы, где порядок 1, 2, … N нарушен?
Вот еще пример:
Есть группа Алкоголь 1, в ней элементы:
Водка 2
Пиво 2.5
Эль 3
Есть группа Мясное 2, в ней элементы:
Сосиски 3
Ветчина 5
Есть группа Напитки 3, в ней элементы:
Квас 1
Сок 2
Нужно по этому пример найти запросом группы, где нарушен порядок 1, 2, N.
Правильный ответ: Алкоголь, Мясное.
Неправильные ответы: Напитки, Корень.