Итерация с помощью цикла For через временную таблицу в PostgreSQL - PullRequest
0 голосов
/ 17 мая 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вам не нужен подзапрос, и вам не нужно повторять таблицу 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;

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

0 голосов
/ 17 мая 2018

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

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
...