#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, так что пока он работает!! (как мы говорим в Новой Зеландии) 😉