2016-05-24 2 views
0

У меня есть действия таблицы, которая имеет строки упорядоченных по времениЗаполнение пробелов в PostgreSQL

| time | session | 
|----------|-----------| 
| 16:10:10 | session_1 | 
| 16:13:05 | null  | 
| 16:16:43 | null  | 
| 16:23:12 | null  | 
| 16:24:01 | session_2 | 
| 16:41:32 | null  | 
| 16:43:56 | session_3 | 
| 16:51:22 | session_4 | 

Я хочу написать отборную, который положит предыдущее значимое значение вместо нулей

Как получить этот результат с PostGreSQL?

| time | session | 
|----------|-----------| 
| 16:10:10 | session_1 | 
| 16:13:05 | session_1 | 
| 16:16:43 | session_1 | 
| 16:23:12 | session_1 | 
| 16:24:01 | session_2 | 
| 16:41:32 | session_2 | 
| 16:43:56 | session_3 | 
| 16:51:22 | session_4 | 

ответ

1
update Actions a 
set session = (
    select session 
     from Actions 
    where time = (
      select max(time) from Actions b 
      where b.time < a.time and session is not null 
    ) 
) where session is null; 

Я попытался это с «время» в качестве ИНТ и «сеанса», как межд [проще добавить данные].

drop table Actions;  
create table Actions (time int, session int);  
insert into Actions values (1,10),(2,null),(3,null),(4,2),(5,null),(6,3),(7,4);  
select * from Actions order by time;  
update Actions a ...;  
select * from Actions order by time; 

enter image description here

EDIT

Ответ на измененному вопрос.

select a1.time, a2.session 
from Actions a1 
     inner join 
     Actions a2 
     on a2.time = (
     select max(time) from Actions b 
      where b.time <= a1.time and session is not null 
     ) 
+0

Отлично! Спасибо –

+0

Могу ли я сделать это в списке, не обновляя таблицу? –

+1

@Timur см. Модифицированный ответ. –

Смежные вопросы