В моей базе данных есть следующие две таблицы:
a) Таблица, содержащая значения, полученные на определенную дату (вы можете думать о них, например, как о показаниях температуры):
</p>
<pre>
sensor_id | acquired | value
----------+---------------------+--------
1 | 2009-04-01 10:00:00 | 20
1 | 2009-04-01 10:01:00 | 21
1 | 2009-04 01 10:02:00 | 20
1 | 2009-04 01 10:09:00 | 20
1 | 2009-04 01 10:11:00 | 25
1 | 2009-04 01 10:15:00 | 30
...
</pre>
<p>
Интервал между показаниями может отличаться, но комбинация (sensor_id
, acquired
) является уникальной.
b) Вторая таблица, содержащая периоды времени и описание (вы можете думать о них, например, как о периодах, когда кто-то включал радиатор):
</p>
<pre>
sensor_id | start_date | end_date | description
----------+---------------------+---------------------+------------------
1 | 2009-04-01 10:00:00 | 2009-04-01 10:02:00 | some description
1 | 2009-04-01 10:10:00 | 2009-04-01 10:14:00 | something else
</pre>
<p>
Опять же, длина периода может отличаться, но для любого конкретного датчика никогда не будет перекрывающихся периодов времени.
Я хочу получить результат, который выглядит следующим образом для любого датчика и любого диапазона дат:
</p>
<pre>
sensor id | start date | v1 | end date | v2 | description
----------+---------------------+----+---------------------+----+------------------
1 | 2009-04-01 10:00:00 | 20 | 2009-04-01 10:02:00 | 20 | some description
1 | 2009-04-01 10:10:00 | 25 | 2009-04-01 10:14:00 | 30 | some description
</pre>
<p>
Или в тексте из: дано sensor_id
и диапазон дат range_start
и range_end
,
найти мне все периоды времени, которые перекрываются с диапазоном дат (то есть start_date < range_end
и end_date > range_start
), и для каждой из этих строк найти соответствующие значения из таблицы значений для периодов start_date
и end_date
(найдите первую строку с acquired > start_date
и acquired > end_date
).
Если бы не столбцы start_value
и end_value
, это был бы тривиальный пример из учебника о том, как объединить две таблицы.
Можно ли каким-то образом получить нужный вывод в одном выражении SQL, не прибегая к написанию функции PL / SQL для нахождения этих значений?
Если я не упустил что-то явно очевидное, этого нельзя сделать с помощью простых подвыборов.
База данных - Oracle 11g, поэтому любые специфичные для Oracle функции приемлемы.
Редактировать: да, циклы возможны, но я хочу знать, можно ли это сделать с помощью одного выбора SQL.