Как суммировать перекрывающиеся таймфреймы по нескольким таблицам - PullRequest
0 голосов
/ 28 марта 2019

У меня есть несколько таблиц с несколькими таймфреймами, которые мне нужны для вычисления времени перекрытия, когда перекрываются все таблицы, но не иначе.

В приведенном ниже примере мне нужно было бы только суммировать время для таймфреймов с границами:

enter image description here

Невозможно просто использовать базовые тета-объединения, поскольку A не всегда <или> X и т. Д.

Пример таблицы:

PLACE 1 PLACE 1 TIME IN     PLACE 1 TIME OUT    PLACE 2 PLACE 2 TIME IN     PLACE 2 TIME OUT    PLACE 3 PLACE 3 TIME IN     PLACE 3 TIME OUT
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 07:06:00.000 2013-05-09 08:24:00.000 3931    2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 07:06:00.000 2013-05-09 08:24:00.000 3931    2013-05-09 08:49:00.000 2013-05-09 09:36:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 07:06:00.000 2013-05-09 08:24:00.000 3931    2013-05-09 07:52:00.000 2013-05-09 08:21:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 07:06:00.000 2013-05-09 08:24:00.000 3931    2013-05-09 09:57:00.000 2013-05-09 10:39:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 15:06:00.000 2013-05-09 15:39:00.000 3931    2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 15:06:00.000 2013-05-09 15:39:00.000 3931    2013-05-09 08:49:00.000 2013-05-09 09:36:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 15:06:00.000 2013-05-09 15:39:00.000 3931    2013-05-09 07:52:00.000 2013-05-09 08:21:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 15:06:00.000 2013-05-09 15:39:00.000 3931    2013-05-09 09:57:00.000 2013-05-09 10:39:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 11:22:00.000 2013-05-09 12:31:00.000 3931    2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 11:22:00.000 2013-05-09 12:31:00.000 3931    2013-05-09 08:49:00.000 2013-05-09 09:36:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 11:22:00.000 2013-05-09 12:31:00.000 3931    2013-05-09 07:52:00.000 2013-05-09 08:21:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 11:22:00.000 2013-05-09 12:31:00.000 3931    2013-05-09 09:57:00.000 2013-05-09 10:39:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 12:52:00.000 2013-05-09 14:35:00.000 3931    2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 08:54:00.000 2013-05-09 11:02:00.000 3931    2013-05-09 11:04:00.000 2013-05-09 12:16:00.000
3929    2013-05-09 07:06:00.000 2013-05-09 08:29:00.000 3930    2013-05-09 12:52:00.000 2013-05-09 14:35:00.000 3931    2013-05-09 08:49:00.000 2013-05-09 09:36:00.000

1 Ответ

0 голосов
/ 28 марта 2019

Хорошо, это двухэтапный процесс.Во-первых, вы хотите найти строки, у которых есть перекрывающиеся строки в других таблицах.

Старый метод обнаружения перекрытия между двумя диапазонами заключается в том, что перекрытие может существовать, только если начало диапазона A не следует послеконец диапазона B, И конец диапазона A не перед началом диапазона B.

Другими словами, если B начинается до конца A, а B также заканчивается после запуска A, то существуетoverlap.

Теперь, как выразить это в SQL: вы начинаете с «корневой» таблицы в качестве первой таблицы в предложении FROM.Давайте назовем его Table1 со столбцами A & B (исходя из вашего изображения).

Чтобы найти строки в двух других таблицах, которые имеют какое-либо перекрытие, ПРИСОЕДИНЯЙТЕСЬ так:

FROM Table1 t1
INNER JOIN Table2 t2
  ON t2.E <= t1.B AND t2.F >= t1.A
INNER JOIN Table3 t3  --this table has to overlap both of the others
  ON t3.X <= t1.B AND t3.Y >= t1.A
  AND t3.X <= t2.F AND t3.Y >= t2.E

Byиспользуя ВНУТРЕННИЕ СОЕДИНЕНИЯ, все строки, которые не имеют перекрытий во всех трех таблицах, исключаются из рассмотрения.

Затем, чтобы вернуть только периоды, которые перекрываются, получите МАКС. t1.A, t2.E, t3.X в качестве начала перекрытия,и МИНУТА t1.B, t2.F, t3.Y как конец перекрытия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...