Итак, вот еще одна задача «написать запрос в X».
Я наблюдаю за несколькими сетевыми торговыми автоматами. Каждая машина имеет несколько частей, например, приемник банкнот, система монет, принтер и т. д.
Проблемы с деталями машины заносятся в таблицу, назовем ее «неисправностями», которая выглядит примерно так (ненужные поля опущены):
machineid partid start_time end_time
--------- ------ ---------------- ----------------
1 2 2009-10-05 09:00 NULL
1 3 2009-10-05 08:00 2009-10-05 10:00
2 2 2009-09-30 12:00 2009-09-30 14:00
3 4 2009-09-28 13:00 2009-09-28 15:00
3 2 2009-09-28 12:00 2009-09-28 14:00
end_date имеет значение NULL, если проблема продолжается в настоящее время.
Мне нужен запрос, который показывает периоды времени, в течение которых машина в целом не работает, и который может учитывать перекрывающиеся диапазоны, объединяя их в одну запись. Таким образом, для приведенных выше примерных данных будет получено:
machineid start_time end_time
--------- ---------------- ----------------
1 2009-10-05 08:00 NULL
2 2009-09-30 12:00 2009-09-30 14:00
3 2009-09-28 12:00 2009-09-28 15:00
Нетрудно написать процедурный код, чтобы сделать эту строку построчно, но хороший декларативный SQL-запрос был бы более полезным, более элегантным. Кажется, это должно быть возможно, но я просто не могу туда добраться.
Диалект SQL - это Oracle. Аналитические функции доступны, если это поможет.
Спасибо!