Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Поиск предыдущего NOT NULL значения в данной группе  [new]
Murderface_
Member

Откуда:
Сообщений: 2
Добрый день! Подскажите пожалуйста как можно найти последнее NOT NULL значение?
На скриншоте таблица, ниже код для ее создания. Нужно заменить NULL значения в столбце text на значения, где для текущего id и меньшего partition_id в столбце text есть NOT NULL значение. Т. е. в строке 2 будет one, в строке 3 one, в строке 5 NULL (т. к. это первый ID и для него нет меньшего NOT NULL partition_id, в строке 7 three.

CREATE TABLE my_table (id int, partition_id int, text varchar);
INSERT INTO my_table VALUES
(1, 1, 'one'),
(1, 2, NULL),
(1, 3, NULL),
(1, 4, 'two'),
(2, 1, NULL),
(2, 2, 'three'),
(2, 3, NULL);


P. s. а можно как то с помощью SQL запроса в самом сообщении таблицу создавать, чтобы не картинкой? Скриншот с таблицей тоже почему то не могу приложить(

Сообщение было отредактировано: 23 июл 20, 10:21
23 июл 20, 10:21    [22172141]     Ответить | Цитировать Сообщить модератору
 Re: Поиск предыдущего NOT NULL значения в данной группе  [new]
court
Member

Откуда:
Сообщений: 2016
Murderface_,

если не "испугает" :)
select 
	id
    ,partition_id 
    ,text
    ,coalesce(text, substring(max(right('000000'||partition_id, 6)||text)over(partition by id order by partition_id),7)) as xz
from test.my_table


idpartition_idtextxz
11oneone
12nullone
13nullone
14twotwo
21nullnull
22threethree
23nullthree
23 июл 20, 13:00    [22172278]     Ответить | Цитировать Сообщить модератору
 Re: Поиск предыдущего NOT NULL значения в данной группе  [new]
Murderface_
Member

Откуда:
Сообщений: 2
Большое спасибо! Буду разбираться.
23 июл 20, 13:05    [22172282]     Ответить | Цитировать Сообщить модератору
 Re: Поиск предыдущего NOT NULL значения в данной группе  [new]
Cristiano_Rivaldo
Member

Откуда:
Сообщений: 327
SELECT
    t.*,
    COALESCE(t.text, b.text) AS bef
FROM my_table t
    LEFT JOIN LATERAL (SELECT
                           g.text
                       FROM my_table g
                       WHERE g.id = t.id
                         AND g.partition_id < t.partition_id
                         AND g.text IS NOT NULL
                       ORDER BY
                           g.partition_id DESC
                       LIMIT 1 ) b
              ON TRUE
24 июл 20, 11:26    [22173006]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить