проблема с циклом postgress при циклировании над таблицей данных

#postgresql #for-loop

#postgresql #for-цикл

Вопрос:

Здесь полный новичок в postgress. Работа с таблицей, содержащей несколько строк данных для пользователей для различных событий. Ищем среднее значение данных для каждого пользователя для определенного события, а затем суммируем любые данные выше среднего значения пользователей

До сих пор я добирался до этого, используя различные блоги и форумы

 CREATE TEMPORARY TABLE foo(
    fanSound INT,
    fanId VARCHAR(80)
);

DO $$
DECLARE
    fan record;
BEGIN
    FOR fan IN
        SELECT DISTINCT phone_id as "fanId", AVG(sound_db) as "avgSound", game_id as "gameId"
        FROM gamedata
        WHERE game_id = '{{gameId}}'
        GROUP BY phone_id, game_id
    LOOP
        EXECUTE 'INSERT INTO foo SELECT SUM(sound_db) as "fanSound", phone_id as "fanId"
        FROM gamedata
        WHERE game_id = fan.gameId AND phone_id = fan.fanId AND sound_db > fan.avgSound
        GROUP BY phone_id';
    END LOOP;
END;
$$;
SELECT * FROM foo
  

получение этой ошибки

Ошибка при выполнении запроса: отсутствует запись в предложении для таблицы «fan» СТРОКА 3: ГДЕ game_id = fan.GameID И phone_id = fan.FanID … ^ ЗАПРОС: ВСТАВИТЬ В foo SELECT SUM(sound_db) как «fanSound», phone_id как «FanID» ИЗ gamedata, ГДЕ game_id = fan.GameID И phone_id = fan.FanID И sound_db> fan.avgSound ГРУППИРОВАТЬ ПО phone_id КОНТЕКСТ: функция PL / pgSQL inline_code_block строка 11 при ВЫПОЛНЕНИИ

Может кто-нибудь указать мне правильное направление? Из того, что я могу сказать, мне нужно поместить данные во временную таблицу, поскольку ЦИКЛ не может возвращать результаты??

Если есть лучшие способы, я весь внимание 😉

Комментарии:

1. Избавьтесь от ненужного динамического SQL. Но вам вообще не нужен цикл или PL / pgSQL. Это можно сделать с помощью одного insert .. select ... оператора.

2. Непосредственная проблема заключается game_id = fan.gameId в следующем. Вы не указали таблицу fan в себе FROM . Я предполагаю, что вы FROM gamedata JOIN fan ON game_id = fan.gameID AND phone_id = fan.fanId ... также хотели, чтобы fan столбцы, созданные в кавычках, были смешанными, тогда вам нужно будет указать их выше. Также не уверен, откуда {{gameId}} это происходит? Не ясно, что вы хотите, чтобы функция выполняла. DO Функция не может возвращать результаты, для этого вам понадобится обычная функция. В этом случае вы можете вернуть результаты в виде таблицы.

3. Спасибо @AdrianKlaver, ваш ответ подтолкнул меня в правильном направлении, и сейчас я в процессе. Возможно, не так элегантно, как могло бы быть, но это сценарий типа POC, так что пока он работает!! (как мы говорим в Новой Зеландии) 😉

4. Спасибо @a_horse_with_no_name, ваш ответ подтолкнул меня в правильном направлении, и сейчас я в процессе. Возможно, не так элегантно, как могло бы быть, но это сценарий типа POC, так что пока он работает!! (как мы говорим в Новой Зеландии) 😉