Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите написать запрос  [new]
al583
Member

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

В базе данных системы сбора метеорологической информации «Гидрометцентра России» для хранения показаний температуоы воздуха используется таблица 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
//вроде как считает по формуле и возвращает число. ток число дней в марте еще надо считать наверно


К сообщению приложен файл (Bilet2 (1).docx - 46Kb) cкачать
24 июн 12, 22:08    [12767264]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
al583,

RTFM LEAD, чтобы научиться получать значение столбца в следующей строке.
25 июн 12, 00:26    [12767655]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
al583
Member

Откуда:
Сообщений: 3
Получилось такое
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';
25 июн 12, 08:31    [12767928]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Добрый Э - Эх
Guest
al583,

Хотя бы на своих же тестовых данных проверял?
Сдается мне, что такой запрос не даст в результате значение "27.34"...

Вот так попробуй:
select to_char(trunc(moment,'mm'),'fmMonth yyyy') as x_month,
       round(sum((value + next_value)*(next_moment - moment)/ 2 / extract(day from last_day(trunc(moment,'mm')))) ,2) x_temp
  from (
         select moment, value,
                lead(moment) over(order by moment) as next_moment,
                lead(value) over(order by moment) as next_value
           from indication
          where moment between date'2010-01-01'
                           and date'2011-01-01'
       ) x
 where next_moment is not null
 group by trunc(moment,'mm')
25 июн 12, 09:14    [12768061]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
al583,

лучше приведи что есть и что надо получить...
25 июн 12, 09:55    [12768253]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
al583
Member

Откуда:
Сообщений: 3
Работу препод засчитал, а за истиной я не очень гонюсь =) спасибо ребята
25 июн 12, 13:58    [12770412]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить