Помогите составить SQL запрос

Gasparfx

Есть таблица с 2 полями: DateTime, Value
В таблицу в определённые промежутки времени (неравномерные) записывается инфа со счётчика электроэнергии.
В поле DateTime хранится дата и время, в Value значения мгновенной мощности в кВт.
Нужно проинтегрировать данные таблицы за сутки по времени, т.е. подсчитать потреблённую мощность в кВт*час за сутки.
Можно ли это сделать как нибуть ОДНИМ SQL запросом, который сразу бы возвращал значение интеграла или придётся делать выборку всего архива за сутки и по циклу его интегрировать в делающей запрос программе. Проблема второго варианта в необходимости получения большого объёма данных при выборке архива за сутки.
Интегрирование простейшее, методом прямоугольников.
БД Oracle, создать хранимую процедуру на сервере нет возможности.

sbs-66

Для начала надо определиться, что в данном случае значит проинтегрировать, т.к. функции пока никакой нет.
Вообще говоря ответ на этот вопрос не однозначен.

kruzer25

Ты сначала определись хотя бы, по какой формуле интегрировать будешь.
Можно интегрировать ступенчатый график, можно кусочно-линейный, а можно вообще многочлен n степени (n - количество точек-1)

sinet

Почти то, что тебе нужно:
    select
     sumDateTime - lag(DateTime,1,:start_date) over (order by DateTime * Value)
    from table
    where DateTime>=:start_date and DateTime<=:end_date

Gasparfx

не работаед :(

18:42:32 select sumDateTime - lag(DateTime,1,'5-ДЕК-2007 00:00:00') over (order by DateTime * Value) from TAG_000205 where DateTime>='5-ДЕК-2007 00:00:00' and DateTime<='6-ДЕК-2007 00:00:00'
18:42:32 *
18:42:32 ORA-30483: функции окна в данном месте запрещены
18:42:32 *** Script stopped due to error ***
18:42:32 *** SCRIPT END : Session:ARORCL(1) 5-дек-2007 18:42:32 ***
18:42:32 End SQL Editor Execution

sinet

Так попробуй:
select sum(Value) from (
select (DateTime - lag(DateTime,1,:start_date) over (order by DateTime * Value as Value
from table where DateTime>=:start_date and DateTime<=:end_date
)

Gasparfx

Решил задачу
select sum(value) from (SELECT EXTRACT(HOUR FROM (DateTime - lag(DateTime,1,'5-ДЕК-2007 00:00:00') over (order by DateTime*3600 + 
EXTRACT(MINUTE FROM (DateTime - lag(DateTime,1,'5-ДЕК-2007 00:00:00') over (order by DateTime*60 +
EXTRACT(SECOND FROM (DateTime - lag(DateTime,1,'5-ДЕК-2007 00:00:00') over (order by DateTime*value as value
from TAG_000205
where DateTime>='5-ДЕК-2007 00:00:00' and DateTime<='6-ДЕК-2007 00:00:00')

Проблема была в том, что надо было както отконвертить тип данных INTERVAL в NUMBER
Оставить комментарий
Имя или ник:
Комментарий: