#postgresql
Вопрос:
У меня есть эта таблица, и я должен заполнить значение последним ненулевым значением. Нулевое значение может быть последовательным (одно или несколько).
| 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 РАВНО 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:
Используйте 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
Смотрите демонстрацию.
Комментарии:
1. Существует проблема, если посередине есть НУЛЬ. Он получает 5 вместо 1. dbfiddle.uk/…
2. @sparkle ты прав. Проверьте мой отредактированный ответ.