Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Вот запрос в котором есть просто среднее из 4-х значений продаж. А надо среднее из 3-х максимальных. select osprodid, ostovid, avg(case when skvo > 0 then skvo end) from ( select os.prodid as osprodid,os.tovid as ostovid,sum(kvo) as skvo from olap_sales os where os.period between '2007-09-01' and '2007-09-30' and os.prodid in (797) group by os.prodid,os.tovid union select os.prodid as osprodid,os.tovid as ostovid,sum(kvo) as skvo from olap_sales os where os.period between '2007-10-01' and '2007-10-31' and os.prodid in (797) group by os.prodid,os.tovid union select os.prodid as osprodid,os.tovid as ostovid,sum(kvo) as skvo from olap_sales os where os.period between '2007-11-01' and '2007-11-30' and os.prodid in (797) group by os.prodid,os.tovid union select os.prodid as osprodid,os.tovid as ostovid,sum(kvo) as skvo from olap_sales os where os.period between '2007-12-01' and '2007-12-24' and os.prodid in (797) group by os.prodid,os.tovid ) a group by osprodid, ostovid ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 12:05 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Evgeniy_PostgresSQLВот запрос в котором есть просто среднее из 4-х значений продаж. А надо среднее из 3-х максимальных. В общем виде, без учета деления на ноль - так: (SUM(Skvo) - MIN(Skvo)) / (COUNT(Skvo) - 1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 12:26 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
А если там пять значений (месяцев, периодов) , или больше. нужно общее решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 12:39 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Evgeniy_PostgresSQLА если там пять значений (месяцев, периодов) , или больше. нужно общее решениеНайти 3 максимальных с использованием Order by и limit, найти среднее от них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 12:42 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ. Но там могут быть несколько разных prodid и tovid, среднее из трёх максимальных, нужно найти для уникальных кортежей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 12:45 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Написать свой агрегат? Благо PostgreSQL это позволяет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 12:48 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Evgeniy_PostgresSQLА если там пять значений (месяцев, периодов) , или больше. нужно общее решение Так бы и говорил. Пишу репрокодом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 12:48 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Evgeniy_PostgresSQLСпасибо за ответ. Но там могут быть несколько разных prodid и tovid, среднее из трёх максимальных, нужно найти для уникальных кортежей.Такое ощущение, что в первом вопросе об этом не говорилось. Ваш запрос ищет среднее из четырёх? Доработайте его, чтобы он находил сначала 3 максимальных. Как - я уже написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 12:49 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
pamir Evgeniy_PostgresSQLСпасибо за ответ. Но там могут быть несколько разных prodid и tovid, среднее из трёх максимальных, нужно найти для уникальных кортежей.Такое ощущение, что в первом вопросе об этом не говорилось. Ваш запрос ищет среднее из четырёх? Доработайте его, чтобы он находил сначала 3 максимальных. Как - я уже написал. Согласен. Не говорилось. Я подумал, что это видно из самого запроса. Просто там может быть и 100 раз union :). Я решил столько не писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 12:53 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Evgeniy_PostgresSQLСпасибо за ответ. Но там могут быть несколько разных prodid и tovid, среднее из трёх максимальных, нужно найти для уникальных кортежей. Тьфу-ты, блин - опять условия ужесточились ;) Похоже, что чистым SQL при такой постановке вопроса будет затруднительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 12:58 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Kruchinin Pahan - спасибо, попробую еще так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 13:00 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Evgeniy_PostgresSQL pamir Evgeniy_PostgresSQLСпасибо за ответ. Но там могут быть несколько разных prodid и tovid, среднее из трёх максимальных, нужно найти для уникальных кортежей.Такое ощущение, что в первом вопросе об этом не говорилось. Ваш запрос ищет среднее из четырёх? Доработайте его, чтобы он находил сначала 3 максимальных. Как - я уже написал. Согласен. Не говорилось. Я подумал, что это видно из самого запроса. Просто там может быть и 100 раз union :). Я решил столько не писать.Лучше писать словами требования, а не рассчитывать, что кто-то будет разбираться в запросе, вылавливая там тонкости. Итак. Есть набор данных. Надо для каждой уникальной пары prodid и tovid найти три максимальных и вычислить среднее. Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 13:04 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Спасибо ребята. Я убедился, что рассуждаете и ищите решение в том -же направлении , что и я :) и у меня так-же условия ужесточались. Похоже на SQL эта задача решения не имеет. Только в функции.. А очень не хочется. Может как-то с массивами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 13:04 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Evgeniy_PostgresSQLСпасибо ребята. Я убедился, что рассуждаете и ищите решение в том -же направлении , что и я :) и у меня так-же условия ужесточались. Похоже на SQL эта задача решения не имеет. Только в функции.. А очень не хочется. Может как-то с массивами? А почему бы не написать свой аггрегат? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 15:02 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Пишу агрегат, но он медленно работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 16:06 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
Evgeniy_PostgresSQLПишу агрегат, но он медленно работает.покажите команды создания агрегата, и explain analyze медленно работающего запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2008, 10:25 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
CREATE TABLE avg3max ( num numeric ) WITHOUT OIDS; CREATE OR REPLACE FUNCTION avg3max(numeric, numeric) RETURNS numeric AS 'insert into avg3max (num) VALUES ($2); select $1 ' LANGUAGE 'sql' VOLATILE; CREATE OR REPLACE FUNCTION avg3maxf(numeric) RETURNS numeric AS $BODY$ DECLARE rez numeric; BEGIN SELECT INTO rez sum(num)/3 from (select num::numeric from avg3max order by num desc limit 3) as a; delete from avg3max; RETURN rez; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; CREATE AGGREGATE avg3max( BASETYPE=numeric, SFUNC=public.avg3max, STYPE=numeric, FINALFUNC=public.avg3maxf, INITCOND='0' ); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2008, 13:56 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
идея такая. в агрегатной функции в качестве состояния использовать массив состоящий не более чем из трех элементов - это будут три максимальных элемента из встреченных до сих пор. по приходу нового элемента его значение сравнивается с минимальным из имеющихся в массиве, и, если больше, то записывается в массив вместо него. промежуточная таблица avg3max не нужна ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2008, 14:32 |
|
||
|
Найти среднее из 3-х максимальных
|
|||
|---|---|---|---|
|
#18+
CREATE OR REPLACE FUNCTION avg3max(numeric[], numeric) RETURNS numeric[] AS $BODY$ DECLARE rez numeric[3]; BEGIN rez := '{0,0,0}'; if $2 > $1[1] then if $2 > $1[2] then if $2 > $1[3] then rez[3] := $2; rez[2] := $1[3]; rez[1] := $1[2]; else rez[3] := $1[3]; rez[2] := $2; rez[1] := $1[2]; end if; else rez[3] := $1[3]; rez[2] := $1[2]; rez[1] := $2; end if; else rez :=$1; end if; RETURN rez; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; CREATE OR REPLACE FUNCTION avg3maxf(numeric[]) RETURNS numeric AS $BODY$ DECLARE rez numeric; BEGIN rez := ($1[1] + $1[2] + $1[3])/3; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2008, 17:59 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35123818&tid=2004542]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 359ms |

| 0 / 0 |
