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.