PostgreSQL
 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Дизайн на база данни за създаване на таблици в движение

  2. Oracle към PostgreSQL:ЗАПОЧНЕТЕ С/СВЪРЖЕТЕ ОТ

  3. Как да защитите своята PostgreSQL база данни - 10 съвета

  4. Инсталации на postgresql с един екземпляр

  5. Моите любими разширения на PostgreSQL - първа част