sql >> Databasteknik >  >> RDS >> PostgreSQL

Hämta det senaste kända värdet för varje kolumn i en rad

Här skapar jag en aggregeringsfunktion som samlar kolumner till arrayer. Sedan är det bara att ta bort NULL och välja det sista elementet från varje array.

Exempeldata

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    );

Lösning

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;

Resultat

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


  1. Är kapslade transaktioner tillåtna i MySQL?

  2. Hur man fångar undantag för SQLServer timeout

  3. Exempel på SQL Servers sys.dm_sql_referenced_entities() som returnerar en enhet som refererar till en länkad server

  4. Bygga en Hot Standby på Amazon AWS med MariaDB Cluster