Я пытаюсь решить несколько сложных проблем в SQL, где мне нужно вывести использование активов из интервалов событий и только что узнали о Allen Interval Алгебра, которая, по-видимому, является ключом к решению этих проблем.
Алгебра описывает 13 видов отношений между интервалами, а на изображении ниже показаны первые семь, а остальное - обратное (т.е. y до x, y соответствует x и т.д.)
Но у меня возникли проблемы с поиском способов выполнения соответствующих операций.
Учитывая мои данные примера, как я могу получить результаты следующих трех типов операций в SQL или PLSQL?
- разъединять
- Сокращение
- Найти пробелы
См. мою ссылку SQLFiddle: http://sqlfiddle.com/#!4/cf0cc
Исходные данные
start end width
[1] 1 12 12
[2] 8 13 6
[3] 14 19 6
[4] 15 29 15
[5] 19 24 6
[6] 34 35 2
[7] 40 46 7
Операция 1 - Disconnined Result
Мне бы хотелось, чтобы запрос возвращал disjoint set
из приведенных выше данных, где все перекрывающиеся интервалы были разбиты на строки таким образом, что не существует перекрытия.
Как мне обойти этот SQL?
start end width
[1] 1 7 7
[2] 8 12 5
[3] 13 13 1
[4] 14 14 1
[5] 15 18 4
[6] 19 19 1
[7] 20 24 5
[8] 25 29 5
[9] 34 35 2
[10] 40 46 7
Операция 2 - Уменьшенный результат
Как я могу уменьшить/сплющить интервалы, такие как:
- не пусто (т.е. имеют ненулевую ширину);
- не перекрывается;
- заказывается слева направо;
- даже не соседствует (т.е. должен быть пустой пробел между двумя последовательными диапазонами)
В моем примере это будет выглядеть так:
start end width
[1] 1 29 29
[2] 34 35 2
[3] 40 46 7
Операция 3 - Результат разрыва
Также, как бы я нашел пробелы?
start end width
[1] 30 33 4
[2] 36 39 4