powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Найти среднее из 3-х максимальных
20 сообщений из 20, страница 1 из 1
Найти среднее из 3-х максимальных
    #35123678
Evgeniy_PostgresSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот запрос в котором есть просто среднее из 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
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35123758
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Evgeniy_PostgresSQLВот запрос в котором есть просто среднее из 4-х значений продаж. А надо среднее из 3-х максимальных.

В общем виде, без учета деления на ноль - так:
(SUM(Skvo) - MIN(Skvo)) / (COUNT(Skvo) - 1)
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35123806
Evgeniy_PostgresSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если там пять значений (месяцев, периодов) , или больше. нужно общее решение
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35123818
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Evgeniy_PostgresSQLА если там пять значений (месяцев, периодов) , или больше. нужно общее решениеНайти 3 максимальных с использованием Order by и limit, найти среднее от них.
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35123827
Evgeniy_PostgresSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ. Но там могут быть несколько разных prodid и tovid, среднее из трёх максимальных, нужно найти для уникальных кортежей.
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35123836
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написать свой агрегат? Благо PostgreSQL это позволяет.
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35123840
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Evgeniy_PostgresSQLА если там пять значений (месяцев, периодов) , или больше. нужно общее решение
Так бы и говорил. Пишу репрокодом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT Avg(Skvo)
FROM (
SELECT
Date_Trunc('Month', Os.Period) AS Os_Period,
SUM(Kvo) AS SKvo
FROM Olap_Sales
WHERE Os.Period BETWEEN '2007-01-01' AND '2007-12-31'
GROUP BY  1 
ORDER BY  2  DESC
LIMIT  3 ) CurMain
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35123845
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Evgeniy_PostgresSQLСпасибо за ответ. Но там могут быть несколько разных prodid и tovid, среднее из трёх максимальных, нужно найти для уникальных кортежей.Такое ощущение, что в первом вопросе об этом не говорилось.
Ваш запрос ищет среднее из четырёх? Доработайте его, чтобы он находил сначала 3 максимальных. Как - я уже написал.
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35123861
Evgeniy_PostgresSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pamir Evgeniy_PostgresSQLСпасибо за ответ. Но там могут быть несколько разных prodid и tovid, среднее из трёх максимальных, нужно найти для уникальных кортежей.Такое ощущение, что в первом вопросе об этом не говорилось.
Ваш запрос ищет среднее из четырёх? Доработайте его, чтобы он находил сначала 3 максимальных. Как - я уже написал.

Согласен. Не говорилось. Я подумал, что это видно из самого запроса. Просто там может быть и 100 раз union :). Я решил столько не писать.
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35123892
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Evgeniy_PostgresSQLСпасибо за ответ. Но там могут быть несколько разных prodid и tovid, среднее из трёх максимальных, нужно найти для уникальных кортежей.
Тьфу-ты, блин - опять условия ужесточились ;) Похоже, что чистым SQL при такой постановке вопроса будет затруднительно.
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35123906
Evgeniy_PostgresSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kruchinin Pahan - спасибо, попробую еще так.
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35123921
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Evgeniy_PostgresSQL pamir Evgeniy_PostgresSQLСпасибо за ответ. Но там могут быть несколько разных prodid и tovid, среднее из трёх максимальных, нужно найти для уникальных кортежей.Такое ощущение, что в первом вопросе об этом не говорилось.
Ваш запрос ищет среднее из четырёх? Доработайте его, чтобы он находил сначала 3 максимальных. Как - я уже написал.

Согласен. Не говорилось. Я подумал, что это видно из самого запроса. Просто там может быть и 100 раз union :). Я решил столько не писать.Лучше писать словами требования, а не рассчитывать, что кто-то будет разбираться в запросе, вылавливая там тонкости.
Итак. Есть набор данных. Надо для каждой уникальной пары prodid и tovid найти три максимальных и вычислить среднее. Так?
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35123925
Evgeniy_PostgresSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо ребята. Я убедился, что рассуждаете и ищите решение в том -же направлении , что и я :) и у меня так-же условия ужесточались. Похоже на SQL эта задача решения не имеет. Только в функции.. А очень не хочется. Может как-то с массивами?
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35124410
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Evgeniy_PostgresSQLСпасибо ребята. Я убедился, что рассуждаете и ищите решение в том -же направлении , что и я :) и у меня так-же условия ужесточались. Похоже на SQL эта задача решения не имеет. Только в функции.. А очень не хочется. Может как-то с массивами?
А почему бы не написать свой аггрегат?
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35124623
Evgeniy_PostgresSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу агрегат, но он медленно работает.
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35125948
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Evgeniy_PostgresSQLПишу агрегат, но он медленно работает.покажите команды создания агрегата, и explain analyze медленно работающего запроса
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35178336
Фотография Humber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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'
);
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35178432
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
идея такая. в агрегатной функции в качестве состояния использовать массив состоящий не более чем из трех элементов - это будут три максимальных элемента из встреченных до сих пор. по приходу нового элемента его значение сравнивается с минимальным из имеющихся в массиве, и, если больше, то записывается в массив вместо него.

промежуточная таблица avg3max не нужна
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35180840
Фотография Humber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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;
...
Рейтинг: 0 / 0
Найти среднее из 3-х максимальных
    #35180847
Фотография Humber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE OR REPLACE FUNCTION avg3maxf(numeric[])
RETURNS numeric AS
$BODY$
DECLARE
rez numeric;
BEGIN
rez := ($1[1] + $1[2] + $1[3])/3;
RETURN rez;
END;

$BODY$
LANGUAGE 'plpgsql' VOLATILE;
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Найти среднее из 3-х максимальных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]