Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Расчет среднего значения. [D5, D7]


Страницы:   1 2

Neket ©   (2007-11-17 13:17:00) 

Как расчитать среднее только по первым двум значениям? Т.е. Имеется к примеру такая табличка:

Name   |   Value | Date
Name1 |   15      | 15.07.2006
Name1 |   14      | 20.07.2006
Name1 |   11      | 12.07.2006
Name1 |   7        | 11.07.2006
Name2 |   45      |  01.07.2006
Name2 |   37      |  06.07.2006
Name2 |   25      |  16.07.2006
Name2 |   18      |  26.07.2006
..... ну и так далее


И как теперь вычислить среднее значение AVG только первых двух значений. Т.е. чтобы была к примеру такая табличка

Name   |   Value_AVG
Name1 |        14.5
Name2 |        41
..... ну и так далее


P.S. Подозреваю что необходимо использовать аналитический функции, но к сожалению я с ними очень не знаком поэто му решил к вам обратиться. Кто может подскажите пожалуйста :-)


Кщд   (2007-11-27 12:35:00) [1]

>Andrey ©   (26.11.07 09:33) [28]
теперь самое время подумать о кол-ве FTS)


Andrey   (2007-11-27 11:34:00) [2]

>Кщд ©   (27.11.07 10:51) [30]
Ыть, промазал. Никогда особо не использовал rownum, по этому не знал некоторых тонкостей: "Значение ROWNUM присваивается строке после завершения фазы обработки предикатов запроса, но перед выполнением каких-либо сортировок и агрегирований" http://www.oracle.com/global/ru/oramag/mayjune2007/w_dev_asktom56.html


Кщд   (2007-11-27 10:51:00) [3]

поясню - выполните:
[
select rownum, t2.*
        from tbl t2
       order by t2.value desc
]


Кщд   (2007-11-27 10:47:00) [4]

>Andrey ©   (26.11.07 09:33) [28]
>and rownum <= 2
в общем случае, запрос будет возвращать ерунду)


Andrey   (2007-11-26 09:33:00) [5]

select t1.name,
      (select avg(t2.value)
         from tbl t2
        where t2.name = t1.name
          and rownum <= 2
        order by t2.value desc)
 from tbl t1
group by t1.name

Нэ?
Хотя конечно через хранимую лучше будет.


  (2007-11-24 21:26:00) [6]

Удалено модератором


Кщд   (2007-11-20 09:22:00) [7]

>Neket   (19.11.07 14:54) [25]
ради интереса: можно увидеть финальный вариант?


Neket   (2007-11-19 14:54:00) [8]

Все всем спасибо... Все сделал. Все заработало.


Кщд   (2007-11-19 08:59:00) [9]

если так сильно хочется аналитики, то

with t as (
select 1 as ID, 1 as val from dual
union all
select 1 as ID, 2 as val from dual
union all
select 1 as ID, 3 as val from dual
union all
select 2 as ID, 1 as val from dual
union all
select 2 as ID, 2 as val from dual
)
select *
from
(
select id,
      avg(val) over (partition by id order by val) avg_val,
      row_number() over(partition by id order by val) rn,
      count(*) over (partition by id) cnt
from t
) t2
where t2.rn = 1
     and t2.cnt = 2


Кщд   (2007-11-19 08:49:00) [10]

Neket   (18.11.07 09:57) [22]

> select
> name,
> avg(value)  OVER (ORDER BY value rows BETWEEN 1  PRECEDING
> AND CURRENT ROW) as value_avg
> from
> tabel1

без использования partition by результат, в общем случае, будет не тот, что Вам нужен


Neket   (2007-11-18 09:57:00) [11]

В первом случае как раз воспользовался аналитической функцией совместно с max().
select
name,
max(value_avg)
from
(select
name,
avg(value)  OVER (ORDER BY value rows BETWEEN 1  PRECEDING AND CURRENT ROW) as value_avg
from
tabel1
group by name) name_AVG
group by name

Как-то так :-)
Но вот теперь стал вопрос как подвизать сюда этот count или похожую функцию которая позволит не рассматривать в TABLE значения name если его колличесто меньше N где N можно задавать произвольно.


Petr V. Abramov   (2007-11-17 22:34:00) [12]

> Подозреваю что необходимо использовать аналитический функции
100% правильно понимаешь.
понимаю, их много, но сейчасза тебя смотреть лень, а навскидку не помню


Johnmen   (2007-11-17 22:27:00) [13]


> эта, а есть противоположные случаи?

Для простых выборок разве что.


sdts   (2007-11-17 22:19:00) [14]


> Johnmen ©   (17.11.07 22:14) [18]
> Написание ХП обеспечит максимум прозрачности, скорости и
> функциональной гибкости. В данном случае.

эта, а есть противоположные случаи?


Johnmen   (2007-11-17 22:14:00) [15]

Написание ХП обеспечит максимум прозрачности, скорости и функциональной гибкости. В данном случае.


Anatoly Podgoretsky   (2007-11-17 18:00:00) [16]

> Neket  (17.11.2007 17:12:16)  [16]

Есть, это count


Neket   (2007-11-17 17:12:00) [17]

А есть какая нибудь функция в SQL  которой задаеш имя столбца, значение какое либо из этого столбца а она возвращает сколько раз встречается это значение. Т.е.
tabel1
Name   |   Value | Date
Name1 |   15      | 15.07.2006
Name1 |   14      | 20.07.2006
Name2 |   45      |  01.07.2006
Name2 |   37      |  06.07.2006
Name2 |   25      |  16.07.2006

Count_Zna4(Tabel1,'NAME1') =2
Count_Zna4(Tabel1,'NAME2') =3
ну или чегонибудь похожее...


Anatoly Podgoretsky   (2007-11-17 17:01:00) [18]

Надо тор 2 использовать во внутреннем селекта, а по нему уже брать среднее.


Kolan   (2007-11-17 16:48:00) [19]


> Т.е. Не фиксировано 4 значения каждого Name, а колеблится
> от 1 до 4. В связи с этим необходимо если колличество значений
> nameN, тогда не обрабатывать эти строки…

Это не понял…


> необходимо добавить условие не обрабатывать name-ы если
> их колличество не равно N, где N — может быть равно от 2
> до 4.

А тут что трудно?
SELECT Name
FROM Tabel
WHERE Count(*) BETWEEN 2 AND 4


Или я не понял вопрос…
GROUP BY Name


Neket   (2007-11-17 16:41:00) [20]

Спасибо... Но уже сам догадался... :-) Теперь другой вопрос... :-( Так сложилось что колличество значений не стаическое а динамическое. Т.е. Не фиксировано 4 значения каждого Name, а колеблится от 1 до 4. В связи с этим необходимо если колличество значений name<>N, тогда не обрабатывать эти строки...
иными словами в селект
SELECT * FROM Table
WHERE
   (Value = (SELECT Max(Value) FROM Table))
OR (Value = (
     SELECT Max(Value) FROM Table WHERE Value <> (SELECT Max(Value) FROM Table)))
необходимо добавить условие не обрабатывать name-ы если их колличество не равно N, где N - может быть равно от 2 до 4.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо