Чтобы не потерять...
Запись от solbrain размещена 18.03.2019 в 14:32
Показов 1483
Комментарии 0
Метки datetime, group by, row_number, sql
|
Второй раз в жизни сталкиваюсь с необходимостью отслеживания перемещения людей по датам. Это полезно, например, для отслеживания движения людей по карьерной лестнице, занимаемых пациентами коек в больнице... да мало ли вариантов. Обычно это выглядит как таблица следующего вида:
Совокупность этих позиций определяет точное положение человека в структуре на дату. Например, так:
Понятно, что для разных баз данных структура может меняться. Например, вместо одной даты, может быть две: Дата начала и Дата окончания. Но это не слишком влияет на алгоритм, применяющийся для выполнения задачи, которая звучит следующим образом: определить периоды, в которые сотрудник занимал каждую должность. Вполне логичным выглядит решение группировкой:
Но в реальной жизни может быть и такая ситуация:
И запрос нам вернёт следующее:
Что, мягко говоря, правдой не является. Так что простой группировкой тут не обойдешься. Особенно, если нужно считать стаж работника в определённой должности. Благодаря помощи invm, получилось для каждого положения сотрудника сделать идентификатор. Как это работает: для начала пронумеруем записи в таблице по каждому сотруднику по дате:
Далее нужно из RN1 вычесть RN2 и получить идентификатор:
И делаем выборку с группировкой, в т.ч. по нашему идентификатору:
В качестве эпилога добавлю, что в моей практике запрос получился гораздо более громоздким за счёт того, что в таблице хранились идентификаторы должностей, а сами должности еще и по категориям делились. Поэтому потребовались некоторые дополнительные преобразования. Тем не менее, представленный алгоритм более, чем рабочий. Я давно собираю простые и изящные решения нетривиальных задач. Надеюсь, со временем этот список дополнится. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Метки datetime, group by, row_number, sql
Размещено в SQL
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии


