Заполните нулевые значения Last not null, используя Last_value()

avatar
sparkle
1 июля 2021 в 17:26
74
1
0

У меня есть эта таблица, и я должен заполнить значение последним ненулевым значением. Нулевое значение может быть последовательным (одно или несколько).

|    date    | value |
+------------+-------+
| 2021-01-05 | NULL  |
| 2021-01-04 | NULL  |
| 2021-01-03 | 3     |
| 2021-01-02 | NULL  |
| 2021-01-01 | 1     |
+------------+-------+

ожидаемый результат

|    date    | value |
+------------+-------+
| 2021-01-05 | 3     |
| 2021-01-04 | 3     |
| 2021-01-03 | 3     |
| 2021-01-02 | 1     |
| 2021-01-01 | 1     |
+------------+-------+

Я пробовал с этим, но он не работает с двумя последовательными нулевыми значениями. Как я могу установить диапазон от последних не нулевых до текущих строк? Что делать, если первое значение равно NULL (например, 2020-12-31 IS null)?

SELECT

    date, 
    last_VALUE(val) 
        OVER(
            PARTITION BY scope_field
            ORDER BY date desc
            RANGE BETWEEN '1 day' PRECEDING AND '1 day' FOLLOWING
        ) last_val
FROM table
Источник

Ответы (1)

avatar
forpas
1 июля 2021 в 17:45
1

Использовать оконную функцию array_agg():

SELECT date,
       COALESCE(value, values[array_upper(values, 1)]::int) AS value
FROM (
  SELECT *,
         array_agg(value::varchar) FILTER (WHERE value IS NOT NULL) OVER (ORDER BY date) AS values
  FROM tablename    
) t  
ORDER BY date DESC

См. демонстрацию.

sparkle
1 июля 2021 в 17:53
0

Возникает проблема, если в середине стоит NULL. Он получает 5 вместо 1. dbfiddle.uk/…

forpas
1 июля 2021 в 18:14
0

@sparkle ты прав. Проверьте мой отредактированный ответ.