sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL kontroluje prvek předchozího záznamu


Nefunguje tak, jak to máte. funkce okna se tak nedá nazvat. Vaše proměnná záznamu r je jako vestavěný kurzor v FOR smyčka. Uvnitř smyčky je viditelný pouze aktuální řádek výsledku. Museli byste integrovat funkci okna lag() do počátečního SELECT .

Ale protože stejně procházíte řádky ve shodném pořadí, můžete to udělat jiným způsobem.

Zvažte tento z velké části přepsaný příklad. Vrátí se na první řádek porušující pravidla:

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;

Další rady

  • Proč alias pro $1 ? Pojmenovali jste to _day již v prohlášení. Držte se toho.
  • Ujistěte se, že víte, jak PostgreSQL zpracovává malá písmena v identifikátorech . (Používám pouze malá písmena.)
  • Od data můžete pouze sčítat/odečítat celá čísla (pro dny).


  1. EF5:Nelze připojit soubor '{0}' jako databázi '{1}'

  2. Jak mohu používat MySQL s Pythonem 3.3 a Django 1.5?

  3. Strategie synchronizace databáze z více míst do centrální databáze a naopak

  4. Proměnné prostředí Docker-compose