Группировка отрезков времени |
||
Данная работа является переработкой статьи Ицик Бен-Ган в применении к учебной базе "Аэрофлот". Здесь будет применен только один из вариантов решения, рассмотренных в вышеуказанной статье. Рассмотрим следующую задачу: Для каждой компании определить интервалы времени, когда в воздухе находился хотя бы один самолет компании. Для работы нам понадобится следующая информация: идентификатор компании, дата-время взлета и посадки самолета. Примечание: для краткости и удобства восприятия, я буду создавать представления, которые будут использоваться по ходу решения задачи. Стоит заметить, что впоследствии легко можно будет "развернуть" получившееся решение в один " select ". Итак. Представление vw_trip
Основная трудность решения заключается в том, что нам не известно, сколько рейсов могут организовывать непрерывный интервал времени, в течение которого в воздухе находился хотя бы один самолет компании (в дальнейшем "интервал"). Для нахождения начала "интервала" воспользуемся таким фактом: начало "интервала" совпадает со стартом самолета, если в этот момент ни какой другой самолет компании не находится в воздухе. Или, другими словами, начало "интервала" совпадает со стартом самолета, если не существует других рейсов компании, которые уже взлетели, но еще не приземлились. Представление vw_dt_start
Пояснения: dt_out < t.dt_out - строгое неравенство, дабы в проверку не попал сам рассматриваемый рейс; dt_in > = t.dt_out - нестрогое неравенство; проверяем также ситуацию, когда один самолет взлетает, а другой в это время садится ("интервал" не разрывается); DISTINCT - убираем дублирование записей на случай одновременного взлета двух или более самолетов. Время окончания "интервала" находится аналогичным образом. Представление vw_dt_end
Теперь нам осталось соединить времена начала и окончания "интервалов". Так как интервалы не пересекаются, то можно утверждать, что время окончания "интервала" - это минимальное время из всех vw_dt_end.dt_in , превосходящих рассматриваемое время начала "интервала". Представление vw_result
Читателю предлагается самостоятельно решить эту задачу без использования представлений (т.е. построить решение в виде единственного оператора SELECT). |