powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Заполнение null между строками
5 сообщений из 5, страница 1 из 1
Заполнение null между строками
    #38726318
Antipich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Не придумал, как правильнее задать тему, поэтому просто опишу тут подробнее.
Есть у меня набор данных вида
idvalue112null3null425null6null718null92
Колонка id отсортирована.
Мне надо, чтобы null, которые между 1 и 2 в колонке value заполнились значением 3. Если после закрывающего значения 2 далее опять идет null(т.е. не было открывающего значения 1), то так Null и оставить
idvalue112333425null6null718392

Интересует решение именно в виде запроса, хранимую процедуру с циклом сделать несложно, там все понятно как.
Заранее благодарю за возможные варианты.
...
Рейтинг: 0 / 0
Заполнение null между строками
    #38726393
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antipich,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
WITH
tt01 AS (
      SELECT 1 AS id, 1 AS value
UNION SELECT 2 AS id, NULL AS value
UNION SELECT 3 AS id, NULL AS value
UNION SELECT 4 AS id, 2 AS value
UNION SELECT 5 AS id, NULL AS value
UNION SELECT 6 AS id, NULL AS value
UNION SELECT 7 AS id, 1 AS value
UNION SELECT 8 AS id, NULL AS value
UNION SELECT 9 AS id, 2 AS value
UNION SELECT 10 AS id, 1 AS value
UNION SELECT 11 AS id, NULL AS value
),

tt02 AS (
SELECT
  t1.id AS f1,
  (SELECT MIN(t2.id) FROM tt01 t2 WHERE t2.id > t1.id AND t2.value = 2) AS f2 
FROM tt01 t1
WHERE t1.value = 1
)

UPDATE tablename SET
  value = 3
WHERE id IN (
SELECT
  tt01.id
FROM tt02
LEFT JOIN tt01 ON tt01.id BETWEEN tt02.f1 AND tt02.f2
              AND tt01.value IS NULL
WHERE tt01.id IS NOT NULL
)
...
Рейтинг: 0 / 0
Заполнение null между строками
    #38726405
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antipich,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
WITH src(id,value) AS ( -- начальные данные
    VALUES (1,1),(2,null),(3,null),(4,2),(5,null),(6,null),(7,1),(8,null),(9,2)
), marks AS (           -- метки для групп, отдельно т.к. оконные функции не могут быть вложенными
    SELECT *,
           CASE WHEN value IS NULL THEN 0 ELSE 1 END m_pre,
           CASE WHEN value IS NULL AND lag(value) OVER (ORDER BY id) IS NOT NULL THEN 1 ELSE 0 END m_post
      FROM src
), grp AS (             -- бегущая сумма по меткам, идентификаторы для групп
    SELECT *,
           sum(m_pre) OVER (ORDER BY id) g_pre,
           sum(m_post) OVER (ORDER BY id) g_post
      FROM marks
), bounds AS (          -- граничные значения в группах
    SELECT *,
           first_value(value) OVER (PARTITION BY g_pre) pre,
           last_value(value) OVER (PARTITION BY g_post) post
      FROM grp
)
SELECT *,
       coalesce(value, CASE WHEN pre=1 AND post=2 THEN 3 END) target
  FROM bounds;
...
Рейтинг: 0 / 0
Заполнение null между строками
    #38726448
Antipich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо.
Пока ждал ответа, сам кое-что родил :) Вот, как я сделал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
WITH src(id,value) AS ( -- начальные данные
    VALUES (1,1),(2,null),(3,null),(4,2),(5,null),(6,null),(7,1),(8,null),(9,2)
)
select s.id, s.value as src_value,  case when s.value is null and mt1.start_id is not null then 3 else s.value end as res_value  from src s
left join
(
   select start_id, end_id from
   (
      select id as start_id, value, lead(id) over (order by id) as end_id from src where value is not null
   ) mt where value=1
) mt1
on s.id between mt1.start_id and mt1.end_id
order by s.id
...
Рейтинг: 0 / 0
Заполнение null между строками
    #38726484
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antipich,

А если изменить начальные данные на
Код: sql
1.
VALUES (1,1),(2,null),(3,null),(4,4),(5,null),(6,null),(7,1),(8,null),(9,2)


какое поведение в таком случае будет корректным? Первая группа должна заполнится или нет?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Заполнение null между строками
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]