Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Написать запрос для определения средневзвешенной т 
:(
    Опции темы
al583
Дата 24.6.2012, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.6.2012

Репутация: нет
Всего: нет



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

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



Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  Bilet2__1_.doc 54,00 Kb
PM MAIL   Вверх
al583
Дата 25.6.2012, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.6.2012

Репутация: нет
Всего: нет



Всем спасибо, сделал сам
PM MAIL   Вверх
Zloxa
Дата 25.6.2012, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Вроде как-то так.
Мог накосячить где-то в расчетах, надо бы вдумчиво потестить
Код

SQL> with t as (
  2    select date '2010-06-05' moment ,30  value from dual
  3    union all select date '2010-07-01' ,35 from dual
  4    union all select date '2010-07-11', 30 from dual
  5    union all select date '2010-07-21', 25 from dual
  6    union all select date '2010-08-01', 20 from dual
  7    union all select date '2010-08-10', 20 from dual
  8  )
  9  ,params as (select date '2010-07-01' from_date,date '2010-08-01' to_date from dual)
 10  select
 11   sum((to_val+from_val)/2*(to_date-from_date))/(max(to_date)-min(from_date)) w_avg
 12  from(
 13    select
 14       greatest(t.from_date,params.from_date) from_date
 15       ,from_val + case when t.from_date < params.from_date
 16                      then  (from_val-to_val)/(t.to_date-t.from_date)*(t.from_date-params.from_date)
 17                      else 0
 18                 end  from_val
 19       ,least(t.to_date,params.to_date) to_date
 20       ,to_val + case when t.to_date > params.to_date
 21                      then  (from_val-to_val)/(t.to_date-t.from_date)*(params.to_date-t.from_date)
 22                      else 0
 23                 end  to_val
 24    from (
 25      select moment from_date
 26             ,value from_val
 27             ,lead(moment) over (order by moment) to_date
 28             ,lead(value) over (order by moment) to_val
 29      from t
 30     )t ,params
 31    where t.from_date between params.from_date and params.to_date
 32         or t.to_date between params.from_date and params.to_date
 33  ) s
 34  ;
 
     W_AVG
----------
27.3387096


Здесь первый подзапрос - преобразует данные к виду даты с - по, значения от - до
Второй подзапрос - отсекает данные вне интересующего нас диапазона выборки, подставляет вместо дат граничные значения в случае, если первому/последнему дню выборки нет точного сопоставления в исходных данных, дорасчитывает значения для граничных дней выборки исходя из условия линейного изменения показателя в течении времени
Третий подзапрос - считает средневзвешенную.

Это сообщение отредактировал(а) Zloxa - 25.6.2012, 09:45


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
al583
Дата 25.6.2012, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.6.2012

Репутация: нет
Всего: нет



у меня вроде так:

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';

PM MAIL   Вверх
Zloxa
Дата 25.6.2012, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(al583 @  25.6.2012,  14:00 Найти цитируемый пост)
вроде так

У вас: 
Цитата(al583 @  24.6.2012,  22:57 Найти цитируемый пост)
На входе: дата начала периода и дата окончания периода.

т.е. периоды, как бы могут быть произвольными. Я правильно понимаю? Тогда делить на 31 нельзя, ибо период может быть вовсе 31 день. Так? Ну и, я так понимаю, никто не обещает, что на дату начала определяемого пользователем периода и на дату, следующую за конечной датой, определенной пользователем периода, в таблице обязана присутствовать запись. Вполне может статься, что вы имеете записи за 10 декабря 10 года, 10 января 11го года и 10 февраля 11го года, в этом случае, посчитанная вами средневзвешенная покажет цены на дрова. нет?

Более того. Вы суммируете значение измерения на начало интервала умноженное на количество дней, а не среднеарифметическое от значения на начале интервала, и конца, как у вас указано в задании.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
al583
Дата 25.6.2012, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.6.2012

Репутация: нет
Всего: нет



Спорить не буду, наверное так и есть smile  Но препод задачу засчитал. ОГРОМНОЕ спасибо за участие smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0459 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.