PDA

Просмотр полной версии : Написать запрос для определения средневзвешенной температуры


al583
24.06.2012, 21:49
Добрый вечер,форумчане.
Помогите мне реализовать такой запрос. Вот суть задачи,ниже наброски решения:

В базе данных системы сбора метеорологической информации «Гидрометцентра России» для хранения показаний температуоы воздуха используется таблица indication (рис.1), состоящая из двух столбцов:
1) moment (тип DATE) - момент снятия показаний, первичный ключ;
2) value (тип NUMBER) - температура воздуха (по шкале Цельсия).
Задача:
Написать запрос для определения средневзвешенной* температуры за март 2011 года (при условии, что между показаниями температура изменяется линейно - монотонно, рис.2).
На входе: дата начала периода и дата окончания периода.
На выходе: число.

* Средневзвешенная температура - это среднее значение температуры с учетом периода действия показания.
Т.е., если есть показания: 01.07.2010 35 ОС, 11.07.2010 30 ОС, 21.07.2010 25 ОС, 01.08.2010 20 ОС, то средневзвешенная температура за июль 2010 года равна
( (35 ОС+30ОС )/2 * 10дн. + (30 ОС +25 ОС )/2 * 10дн + (25 ОС+20 ОС)/2 * 11) / 31дн. = 27,34 ОС


Вот есть пару набросков,но как-то надо их соед-ть в 1 красивый запрос)
Код SQL

SELECT DATE, (SELECT DATE FROM indication WHERE rownum > 1) AS Date2, NUMBER, (SELECT NUMBER FROM indication WHERE rownum > 1) AS number2
//выводит 4 столбца, дополнительные это исходные без первой строки, так получаем в строке соседние даты
SELECT SUM( (NUMBER + number2)*(date2-DATE)/31
//вроде как считает по формуле и возвращает число. ток число дней в марте еще надо считать наверно

al583
25.06.2012, 07:34
Всем спасибо, сделал сам

Marley
25.06.2012, 12:34
al583 - Не могли бы вы опубликовать окончательный результат?
Вы уже разобрались, может еще кому-нибудь пригодится.

al583
25.06.2012, 13:03
У меня получилось вот так:

select SUM(Delta)/31
FROM (select moment, value, value*(TRUNC(LEAD(moment, 1) OVER (ORDER BY moment))-TRUNC(moment)) as Delta FROM indication)
where moment BETWEEN '01.01.2011' AND '31.01.2011';


Если что - http://forum.vingrad.ru/forum/topic-353629/unread-1/anchor-entry2500201/0.html и http://www.sql.ru/forum/actualthread.aspx?bid=3&tid=950839&pg=-1