Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1192 / 761 / 128
Регистрация: 10.03.2012
Сообщений: 4,911

Реализация функций map и reduce

11.04.2025, 11:15. Показов 1381. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Реализовать функции map и reduce, принимающие два параметра: массив вещественных чисел и название вспомогательной
функции, принимающей один параметр вещественного типа. Функция должна возвращать исходный массив, в котором
к каждому элементу применена вспомогательная функция.
1) Функция map должна возвращать исходный массив, в котором к каждому элементу применена вспомогательная функция.
Пример:
SQL
1
map(ARRAY[4.0,9.0],'sqrt') → ARRAY[2.0,3.0]
2) Функция reduce должна возвращать вещественное число, полученное последовательной сверткой массива слева направо.
Пример:
SQL
1
reduce(ARRAY[1.0,3.0,2.0,0.5],'greatest')3.0
В этом случае значение вычисляется как
SQL
1
greatest( greatest( greatest(1.0,3.0), 2.0 ), 0.5 )
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2025, 11:15
Ответы с готовыми решениями:

Mongodb, Map-reduce
Всем привет. Нужно сделать запрос в MongoDB, который за кодом (хранится в одной коллекции) выводит...

Использование функции EXCEPT или реализация запроса другим способом
Здравствуйте всем, как можно реализовать запрос с помощью EXСEPT? В данном случае не работает,...

Реализация функций в БД магазина
Здравствуйте. Сделал БД магазина бытовой техники. Не могу реализовать и не знаю как: При продаже...

7
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 810
17.04.2025, 09:43
map

Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE OR REPLACE FUNCTION pg_temp.map(IN OUT aArray FLOAT[], sFnc text)
  RETURNS FLOAT[] 
  SET search_path TO pg_temp, PUBLIC
  LANGUAGE plpgsql AS
$function$
DECLARE 
  i INTEGER;
  tmp FLOAT;
BEGIN
  FOR i IN 1..array_length(aArray,1) LOOP          
    EXECUTE 'select ' || sfnc || '($1)' USING aArray[i] INTO tmp;
    aArray[i] := tmp;
  END LOOP;
  RETURN;
END;
$function$;
 
SELECT pg_temp.map(ARRAY[4.0,9.0],'sqrt')
reduce

Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE OR REPLACE FUNCTION pg_temp.reduce(aArray FLOAT[], sFnc text)
  RETURNS FLOAT 
  SET search_path TO pg_temp, PUBLIC
  LANGUAGE plpgsql AS
$function$
DECLARE 
  i INTEGER;
  tmp FLOAT;
  acc FLOAT;
BEGIN
  acc := aArray[1];
  FOR i IN 2..array_length(aArray,1) LOOP          
    EXECUTE 'select ' || sfnc || '($1, $2)' USING acc, aArray[i] INTO tmp;
    acc := tmp;
  END LOOP;
  RETURN acc;
END;
$function$;
 
SELECT pg_temp.reduce(ARRAY[1.0,3.0,2.0,0.5],'greatest')
P.S. Только вообще не вижу в этом практического смысла
1
1192 / 761 / 128
Регистрация: 10.03.2012
Сообщений: 4,911
17.04.2025, 16:54  [ТС]
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE FUNCTION map(a INOUT FLOAT[], func text) AS $$ 
DECLARE
    i INTEGER;
    x FLOAT;
BEGIN
    IF cardinality(a) > 0 THEN
        FOR i IN array_lower(a,1)..array_upper(a,1) LOOP
            EXECUTE format('SELECT %I($1)',func) USING a[i] INTO x;
            a[i] := x;
        END LOOP;
    END IF;
    END
$$ IMMUTABLE LANGUAGE plpgsql;
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE FUNCTION reduce(a FLOAT[], func text) RETURNS FLOAT
AS $$
DECLARE
    i INTEGER;
    r FLOAT := NULL;
BEGIN
    IF cardinality(a) > 0 THEN
        r := a[array_lower(a,1)];
        FOR i IN array_lower(a,1)+1 .. array_upper(a,1) LOOP
            EXECUTE format('SELECT %I($1,$2)',func) USING r, a[i]
            INTO r;
        END LOOP;
    END IF;
    RETURN r;
END
$$ IMMUTABLE LANGUAGE plpgsql;
Вариант с циклом FOREACH:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION map(a FLOAT[], func text) RETURNS FLOAT[] AS $$ 
DECLARE
    x FLOAT;
    b FLOAT[];
BEGIN
    FOREACH x IN ARRAY a LOOP
        EXECUTE format('SELECT %I($1)',func) USING x INTO x;
        b := b || x;
    END LOOP;
    RETURN b;
END
$$ IMMUTABLE LANGUAGE plpgsql;
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE OR REPLACE FUNCTION reduce(a FLOAT[], func text) RETURNS FLOAT
AS $$
DECLARE
    x FLOAT;
    r FLOAT;
    FIRST BOOLEAN := TRUE;
BEGIN
    FOREACH x IN ARRAY a LOOP
        IF FIRST THEN
            r := x;
            FIRST := FALSE;
        ELSE
            EXECUTE format('SELECT %I($1,$2)',func) USING r, x INTO r;
        END IF;
    END LOOP;
    RETURN r;
END
$$ IMMUTABLE LANGUAGE plpgsql;
Добавлено через 2 минуты
SQL
1
2
3
4
5
SELECT map(ARRAY[4.0,9.0,16.0],'sqrt');
SELECT map(ARRAY[]::FLOAT[],'sqrt');
SELECT reduce(ARRAY[1.0,3.0,2.0], 'maximum');
SELECT reduce(ARRAY[1.0], 'maximum');
SELECT reduce(ARRAY[]::FLOAT[], 'maximum');
0
1192 / 761 / 128
Регистрация: 10.03.2012
Сообщений: 4,911
18.04.2025, 13:28  [ТС]
Swa111, Как можно сделать полиморфные варианты этих функций?
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 810
18.04.2025, 16:04
В PG полиморфными могут быть только входные параметры. Выходной должен быть определен заранее. Можно конечно возвращать всегда текст или json.

Что бы по цепочке пускать такие функции можно еще передавать параметром тип данных. и тогда если вдруг внутри массива текст, то кастовать его к нужному типу.
0
106 / 67 / 29
Регистрация: 22.04.2022
Сообщений: 232
21.04.2025, 08:36
Вот вполне работающий пример
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
-- object: public._if | type: FUNCTION --
-- DROP FUNCTION IF EXISTS public._if(boolean,anyelement,anyelement) CASCADE;
CREATE FUNCTION public._if (IN _chk BOOLEAN, IN _true anyelement, IN _false anyelement)
    RETURNS anyelement
    LANGUAGE SQL
    IMMUTABLE 
    CALLED ON NULL INPUT
    SECURITY INVOKER
    PARALLEL SAFE
    COST 1000
    AS $$
SELECT CASE WHEN _chk THEN _true ELSE _false END
$$;
0
912 / 286 / 57
Регистрация: 01.06.2023
Сообщений: 810
21.04.2025, 09:18
Да, если входные и выходные параметры одного типа. Но reduce принимает на вход массив, а возвращает скаляр поэтому не получится так сделать.
0
1192 / 761 / 128
Регистрация: 10.03.2012
Сообщений: 4,911
21.04.2025, 11:54  [ТС]
Лучший ответ Сообщение было отмечено Swa111 как решение

Решение

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE FUNCTION map(
    a anyarray,
    func text,
    elem anyelement DEFAULT NULL
) 
RETURNS anyarray
AS $$
DECLARE
    x elem%TYPE;
    b a%TYPE;
BEGIN
    FOREACH x IN ARRAY a LOOP
        EXECUTE format('SELECT %I($1)',func) USING x INTO x;
        b := b || x;
    END LOOP;
    RETURN b;
END
$$ IMMUTABLE LANGUAGE plpgsql;
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE FUNCTION reduce(
    a anyarray,
    func text,
    elem anyelement DEFAULT NULL
) 
RETURNS anyelement
AS $$
DECLARE
    x elem%TYPE;
    r elem%TYPE;
    FIRST BOOLEAN := TRUE;
BEGIN
    FOREACH x IN ARRAY a LOOP
        IF FIRST THEN
            r := x;
            FIRST := FALSE;
        ELSE
            EXECUTE format('SELECT %I($1,$2)',func) USING r, x INTO r;
        END IF;
    END LOOP;
    RETURN r;
END
$$ IMMUTABLE LANGUAGE plpgsql;
SQL
1
2
3
4
5
SELECT map(ARRAY[4.0,9.0,16.0],'sqrt');
SELECT map(ARRAY[]::FLOAT[],'sqrt');
SELECT map(ARRAY[' a ',' b','c '],'btrim');
SELECT reduce(ARRAY[1,-2,4], 'add');
SELECT reduce(ARRAY['a','b','c'], 'concat');
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.04.2025, 11:54
Помогаю со студенческими работами здесь

Реализация и аналог функции REGEXP_COUNT в mysql
Здравствуйте друзья! Есть задача узнать количество вхождений в строке средствами MYSQL, но максимум...

Реализация функционала на стороне сервера
Здравствуйте. Задание: Определить функционал, который может быть реализован на стороне сервера для...

Помогите с реализацией поиска в формах MS Access!!!
Ребят, нужна сторонняя помощь по поиску в форме MS Access. Сам я плохо владею VB - работаю с...

Реализация цикла с 2 запросами одним сложным запросом
Имеются два SQL запроса (для простоты понимания привожу общий упрощенный вид): 1) SELECT Date...

Реализация триггера в Oracle 10g
Доброго времени суток! Мне необходимо создать автоинкрементирование в таьлице. Вот этот пример...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru