sql >> データベース >  >> RDS >> PostgreSQL

前のレコードの要素をチェックするPostgreSQL


    お使いの方法では機能しません。 ウィンドウ関数 そのように呼ぶことはできません。レコード変数r FORの組み込みカーソルのようなものです ループ。結果の現在の行のみがループ内に表示されます。 ウィンドウ関数<を統合する必要があります。 code> lag() 最初のSELECTに入れます 。

    ただし、とにかく一致する順序で行をループしているので、別の方法で行うことができます。

    この大幅に書き直された例を考えてみましょう。最初の違反行に戻ります:

    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;
    

    その他のヒント

    • $ 1のエイリアスが選ばれる理由 ? _dayという名前を付けました すでに宣言で。それに固執する。
    • PostgreSQLが識別子のケース 。 (私は小文字のみを使用します。)
    • 日付から整数(日数)を加算/減算するだけです。


    1. MYSQLは特定の行のみをダンプします

    2. 外部キーは常に別のテーブルの一意のキーを参照しますか?

    3. 複数行のエントリを作成すると、次のエラーが発生します:「フィールドリスト」の不明な列「â€〜FName’」に出席できませんでした

    4. SQL Serverで「smalldatetime」を「datetimeoffset」に変換します(T-SQLの例)