PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL verificando o elemento de um registro anterior



Não funciona do jeito que você tem. Uma função de janela não pode ser chamado assim. Sua variável de registro r é como um cursor embutido em um FOR ciclo. Apenas a linha atual do resultado é visível dentro do loop. Você teria que integrar a função de janela lag() no SELECT inicial .

Mas como você está percorrendo as linhas em uma ordem correspondente, você pode fazer isso de outra maneira.

Considere este exemplo amplamente reescrito. Retorna na primeira linha violada:
CREATE OR REPLACE FUNCTION q8(_day date)
  RETURNS text AS
$BODY$
DECLARE
    r            record;
    last_enddate date;

BEGIN
FOR r IN
    SELECT *
       -- ,lag(r.endDate) OVER (ORDER BY startDate) AS last_enddate
       -- commented, because I supply an alternative solution
    FROM   periods
    ORDER  BY startDate
LOOP
    IF _day BETWEEN r.startDate AND r.endDate THEN
        RETURN 'Violates condition 1';  -- I return differing results
    ELSIF _day BETWEEN (r.startDate - 7) AND r.startDate THEN
        RETURN 'Violates condition 2';
    ELSIF _day BETWEEN last_enddate AND (r.startDate) THEN 
                                      -- removed "- 7 ", that is covered above
        RETURN 'Violates condition 3';
    END IF;

    last_enddate := r.enddate; -- remember for next iteration
END LOOP;

RETURN NULL;

END;
$BODY$ LANGUAGE plpgsql;

Mais dicas

  • Por que o alias para $1 ? Você o nomeou _day já na declaração. Atenha-se a isso.
  • Certifique-se de saber como o PostgreSQL lida com caso nos identificadores . (Só uso letras minúsculas.)
  • Você pode simplesmente adicionar/subtrair números inteiros (para dias) de uma data.