Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 plpgsql - как запомнить значение из пред. строки?  [new]
Алексей Роза
Member [заблокирован]

Откуда: РФ
Сообщений: 557
подскажите пожалуйста, когда идёт перебор строк и мне надо из предыдущей строки значение из колонки col1 использовать в текущей строке и сравнить его с чем-то, манипуляции с ним поделать...
это через lag() только делается и повторным прогоном через WITH (или двумя), или таки можно как-то запомнить в переменную и поюзать на след. строчке в этом же потоке?
Это в любом языке можно сделать изи.
19 июл 20, 19:59    [22170037]     Ответить | Цитировать Сообщить модератору
 Re: plpgsql - как запомнить значение из пред. строки?  [new]
Swa111
Member

Откуда:
Сообщений: 202
Алексей Роза,

обрабатывайте в цикле for... easy

declare
  x record;
  prevCol1 number := null;
begin
  for x in (SELECT Col1, b FROM t)
    loop
      ... здесь код
      prevA := x.Col1;
    end loop;
end;


для особых запущенных случаев - читаем про RETURN NEXT... not easy
19 июл 20, 22:06    [22170075]     Ответить | Цитировать Сообщить модератору
 Re: plpgsql - как запомнить значение из пред. строки?  [new]
Алексей Роза
Member [заблокирован]

Откуда: РФ
Сообщений: 557
о, спасибки
никогда его так не использовал, хоть и читал про это:
автор
42.6.4. Цикл по результатам запроса

Другой вариант FOR позволяет организовать цикл по результатам запроса. Синтаксис:

[ <<метка>> ]
FOR цель IN запрос LOOP
операторы
END LOOP [ метка ];

Переменная "цель" может быть строковой переменной, переменной типа record или разделённым запятыми списком скалярных переменных.
Переменной "цель" последовательно присваиваются строки результата запроса, и для каждой строки выполняется тело цикла.
19 июл 20, 22:14    [22170078]     Ответить | Цитировать Сообщить модератору
 Re: plpgsql - как запомнить значение из пред. строки?  [new]
Алексей Роза
Member [заблокирован]

Откуда: РФ
Сообщений: 557
а как, например, быть в случае, если внутри SELECT есть такое:
WHERE extract(DOW FROM added) NOT IN (6,7) -- выкинуть выходные

а потом этот же extract(DOW ...) встречается уже внутри LOOP
его придётся считать 2 раза для каждой строчки?
20 июл 20, 00:26    [22170128]     Ответить | Цитировать Сообщить модератору
 Re: plpgsql - как запомнить значение из пред. строки?  [new]
Алексей Роза
Member [заблокирован]

Откуда: РФ
Сообщений: 557
можно как-то получаемые строки собрать в некий record прямо в этой ф-и, чтобы потом разом их в INSERT вставить?
или надо отдельную ф-ю с return setof record ?
22 июл 20, 01:03    [22171363]     Ответить | Цитировать Сообщить модератору
 Re: plpgsql - как запомнить значение из пред. строки?  [new]
Swa111
Member

Откуда:
Сообщений: 202
Алексей Роза,

да, можно. Создаете составной тип объявляете переменную с типом массив из строк вашего типа.
declare 
  aMyVar complex[] := '{}';
  complex complex;
  nCount integer := 0;
begin
  aMyVar  := array_append(aMyVar, row(1.0,2.0));
  aMyVar  := array_append(aMyVar, row(2.0,2.0));
  aMyVar  := array_append(aMyVar, row(3.0,3.0));

  insert into myTable select * from unnest(aMyVar ) t;
end;
22 июл 20, 19:54    [22171939]     Ответить | Цитировать Сообщить модератору
 Re: plpgsql - как запомнить значение из пред. строки?  [new]
Алексей Роза
Member [заблокирован]

Откуда: РФ
Сообщений: 557
Swa111, благодарю
у вас complex complex и nCount нигде не участвуют... Они зачем?
И зачем сделаны с одинаковыми названиями: complex[] И complex complex ?

И ещё важный вопрос: я подозреваю, что с т.з. производительности выгоднее будет всё таки ф-ей отдавать setof ?

Сообщение было отредактировано: 23 июл 20, 00:12
23 июл 20, 00:13    [22172046]     Ответить | Цитировать Сообщить модератору
 Re: plpgsql - как запомнить значение из пред. строки?  [new]
Swa111
Member

Откуда:
Сообщений: 202
Алексей Роза,

complex complex; и nCount integer := 0; - было лишним хотел по другому записать добавление в массив через индексную переменную (в стиле Oracle), но вспомнил про функцию array_append.

complex[] - это массив
complex - это элемент массива (одна строчка)
23 июл 20, 20:40    [22172736]     Ответить | Цитировать Сообщить модератору
 Re: plpgsql - как запомнить значение из пред. строки?  [new]
Алексей Роза
Member [заблокирован]

Откуда: РФ
Сообщений: 557
не хочет
ОШИБКА:  функция array_append(agg_ua_t[], record) не существует

делал так:
CREATE TYPE agg_ua_t AS (uid int, from_ts timestamptz(0), to_ts timestamptz(0), gap smallint);

CREATE OR REPLACE FUNCTION f_foo()
RETURNS void LANGUAGE plpgsql AS $$

DECLARE
arr agg_ua_t[]  := '{}';

BEGIN
    arr := array_append(arr, row(333::int, '2020-06-01 10:20:30'::timestamptz(0), '2020-06-01 10:20:30'::timestamptz(0), 30::smallint));
    arr := array_append(arr, row(333::int, '2020-06-01 10:20:30'::timestamptz(0), '2020-06-01 10:20:30'::timestamptz(0), 30::smallint));
    arr := array_append(arr, row(333::int, '2020-06-01 10:20:30'::timestamptz(0), '2020-06-01 10:20:30'::timestamptz(0), 30::smallint));

    INSERT INTO agg_ua SELECT * FROM unnest(arr) t;

END
$$;
26 июл 20, 23:28    [22173931]     Ответить | Цитировать Сообщить модератору
 Re: plpgsql - как запомнить значение из пред. строки?  [new]
Алексей Роза
Member [заблокирован]

Откуда: РФ
Сообщений: 557
в общем я сделал через вызов ф-и с setof record
27 июл 20, 00:00    [22173937]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить