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

行の各列の最後の既知の値を取得します

    ここでは、列を配列に収集する集計関数を作成します。次に、NULLを削除し、各配列から最後の要素を選択するだけです。

    サンプルデータ

    CREATE TABLE T (
        date_time timestamp,
        a text,
        b text,
        c text
    );
    
    INSERT INTO T VALUES ('2013-10-15 11:45:00', NULL, 'timtim', 'fred'),
    ('2013-10-15 13:00:00', 'tune', 'reco', NULL  ),
    ('2013-10-16 12:00:00', 'abc', NULL, NULL     ),
    ('2013-10-16 13:00:00', NULL, 'died', NULL    );
    

    解決策

    CREATE AGGREGATE array_accum (anyelement)
    (
        sfunc = array_append,
        stype = anyarray,
        initcond = '{}'
    );
    
    WITH latest_nonull AS (
        SELECT MAX(date_time) As MaxDateTime, 
               array_remove(array_accum(a), NULL) AS A, 
               array_remove(array_accum(b), NULL) AS B, 
               array_remove(array_accum(c), NULL) AS C
        FROM T
        ORDER BY date_time
    )
    SELECT MaxDateTime, A[array_upper(A, 1)], B[array_upper(B,1)], C[array_upper(C,1)]
    FROM latest_nonull;
    

    結果

         maxdatetime     |  a  |  b   |  c
    ---------------------+-----+------+------
     2013-10-16 13:00:00 | abc | died | fred
    (1 row)
    


    1. CentOS7へのPerconaXtraDBクラスターのインストール

    2. MySQLで現在の合計を計算する方法

    3. SQLServerデータベースのCPU使用統計

    4. 文字列SQLサーバーから番号を削除します