PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Pobierz ostatnią znaną wartość dla każdej kolumny wiersza

Tutaj tworzę funkcję agregującą, która zbiera kolumny w tablice. Następnie wystarczy usunąć wartości NULL i wybrać ostatni element z każdej tablicy.

Przykładowe dane

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

Rozwiązanie

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;

Wynik

     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. Kilka pomysłów na niskopoziomowe pulowanie zasobów w PostgreSQL

  2. Jak połączyć Struts 2 z Hibernate i PostgreSQL?

  3. Uruchamianie hurtowni danych w PostgreSQL

  4. PostgreSQL LIKE wariacje wydajności zapytań

  5. szybki losowy wybór wiersza w Postgresie