![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Расчет среднего значения. [D5, D7]
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.