Я пытаюсь перебрать временную таблицу внутри функции, где я хочу сделать обновление для каждой строки.
Временная таблица должна содержать все идентификаторы пользователей, которые выходят из запроса. После этого для каждого отдельного пользователя следует проверить, не превышает ли процент транзакций с атрибутами 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
Есть ли у кого-нибудь предложения по этому поводу? Спасибо!


Я предполагаю, что вы пытаетесь сделать следующее:
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
Вероятно, это все еще будет страдать от синдрома несколько обновлений для каждой целевой строки (строковые версии). UPDATE account SET col='Female' WHERE EXISTS( ... stuff from transactions ... related to the same account ...), вероятно, избежит этого.
Вам не нужен подзапрос, и вам не нужно повторять таблицу 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;
Я также ввел псевдонимы таблиц, чтобы запросы было легче писать и читать.
пожалуйста, объясните устно, чего вы пытаетесь достичь. ваш код, кажется, делает много ненужных и непонятных вещей. например - вам не нужна временная таблица для перебора результатов. это не то, как вы повторяете. второй выбор не сохраняется в переменной iny. update обновляет все строки до константы ... это так много уровней, что трудно угадать, что вы пытаетесь сделать