Итерация с помощью цикла For по временной таблице в PostgreSQL

Я пытаюсь перебрать временную таблицу внутри функции, где я хочу сделать обновление для каждой строки.

Временная таблица должна содержать все идентификаторы пользователей, которые выходят из запроса. После этого для каждого отдельного пользователя следует проверить, не превышает ли процент транзакций с атрибутами 50% всех транзакций.

В конце концов, необходимо обновить поле аккаунта master_segments.

Мой код выглядит так:

CREATE OR REPLACE FUNCTION temptable()
RETURNS VARCHAR
AS $$
BEGIN

  CREATE TEMP TABLE IF NOT EXISTS testTable AS
    SELECT account.sfid, transactions.transactionNumber
    FROM account
      INNER JOIN transactions ON account.sfid =transactions.accountsfid
      INNER JOIN transactionLineItems ON transactions.transactionNumber = transactionLineItems.transactionNumber
      INNER JOIN products ON transactionLineItems.USIM = products.USIM
        WHERE account.gender = '1' AND (transactions.transactionDate  >= current_date - interval '730' day AND products.gender = 'female' AND products.agegroup = 'adult'); 

    FOR j IN testTable.sfid LOOP
    SELECT(
          (SELECT COUNT(transactions.transactionNumber)
           FROM transactions
           INNER JOIN account ON account.sfid = transactions.accountsfid
           INNER JOIN transactionLineItems ON transactions.transactionNumber = transactionLineItems.transactionNumber
           INNER JOIN products ON transactionLineItems.USIM = products.USIM
           WHERE products.gender = 'male' AND products.agegroup = 'adult' AND transactions.transactionDate >= current_date - interval '730' day)*1.0 /
           (SELECT COUNT(transactions.transactionNumber)
           FROM transactions
           WHERE transactions.transactionDate >= current_date - interval '730' day)
         ) < 0.5;

         UPDATE account 
         SET account.master_segments = 'Women' WHERE account.sfid = testTable.sfid;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

Я получаю это сообщение:

ERROR: syntax error at or near "testTable" LINE 14: FOR j IN testTable.sfid LOOP

Есть ли у кого-нибудь предложения по этому поводу? Спасибо!

пожалуйста, объясните устно, чего вы пытаетесь достичь. ваш код, кажется, делает много ненужных и непонятных вещей. например - вам не нужна временная таблица для перебора результатов. это не то, как вы повторяете. второй выбор не сохраняется в переменной iny. update обновляет все строки до константы ... это так много уровней, что трудно угадать, что вы пытаетесь сделать

Vao Tsun 17.05.2018 10:47
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
523
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я предполагаю, что вы пытаетесь сделать следующее:

UPDATE account 
         SET account.master_segments = 'Women' 
FROM (
    SELECT account.sfid, transactions.transactionNumber
    FROM account
      INNER JOIN transactions ON account.sfid =transactions.accountsfid
      INNER JOIN transactionLineItems ON transactions.transactionNumber = transactionLineItems.transactionNumber
      INNER JOIN products ON transactionLineItems.USIM = products.USIM
        WHERE account.gender = '1' AND (transactions.transactionDate  >= current_date - interval '730' day AND products.gender = 'female' AND products.agegroup = 'adult')
) testtable
WHERE account.sfid = testtable.sfid

Здесь я получаю ошибку ОШИБКА: синтаксическая ошибка рядом с «ОТ» СТРОКА 18: ОТ (строка 18 - это ваша строка 4

BobbyP 17.05.2018 11:01

Вероятно, это все еще будет страдать от синдрома несколько обновлений для каждой целевой строки (строковые версии). UPDATE account SET col='Female' WHERE EXISTS( ... stuff from transactions ... related to the same account ...), вероятно, избежит этого.

joop 17.05.2018 13:08

Вам не нужен подзапрос, и вам не нужно повторять таблицу account для этой логики:

UPDATE account a
     SET master_segments = 'Women' 
FROM transactions t INNER JOIN
     transactionLineItems tli
     ON t.transactionNumber = tli.transactionNumber AND
        t.transactionDate  >= current_date - interval '730' day INNER JOIN
     products p
     ON tli.USIM = p.USIM AND
        p.gender = 'female' AND
        p.agegroup = 'adult'
WHERE a.gender = '1' AND a.sfid = t.sfid;

Я также ввел псевдонимы таблиц, чтобы запросы было легче писать и читать.

Другие вопросы по теме