sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL verificando el elemento de un registro anterior


No funciona como lo tienes. Una función de ventana no se puede llamar así. Su variable de registro r es como un cursor integrado en un FOR círculo. Solo la fila actual del resultado es visible dentro del bucle. Tendría que integrar la función de ventana lag() en el SELECT inicial .

Pero dado que de todos modos está recorriendo las filas en un orden coincidente, puede hacerlo de otra manera.

Considere este ejemplo en gran parte reescrito. Devuelve en la primera fila infractora:

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;

Más consejos

  • Por qué el alias para $1 ? Lo nombraste _day en la declaración ya. Cíñete a eso.
  • Asegúrese de saber cómo maneja PostgreSQL caso en identificadores . (Solo uso minúsculas).
  • Puede simplemente sumar o restar números enteros (por días) de una fecha.