Таблица этого:
field5 field19
Dr 1
Null 2
Null 3
Td 4
Td 5
Null 6
форма должна быть представлена в этом:
field5 field19
Dr 1
Dr 2
Dr 3
Td 4
Td 5
Td 6
Я долго искал, но именно для sqlite я не нашел решения. Пожалуйста помоги
Оконная функция поможет:
select *,
max(field5) over (order by field19)
from table t;
Вы также можете использовать коррелированный подзапрос:
select t.*,
(select t1.field5
from table t1
where t1.field19 <= t.field19 and t1.field5 is not null
order by t1.field19 desc
limit 1
)
from table t;
return full table
вторая версия должна делать то, что вы хотите.
Вы можете использовать это, что находит предыдущее нон null
значение для field5
(если она существует):
select
coalesce(t.field5, (
select tt.field5 from tablename tt where tt.field19 = (
select max(tablename.field19) from tablename where tablename.field19 < t.field19 and tablename.field5 is not null)
)
) as field5,
t.field19
from tablename t
Схема (SQLite v3.26)
CREATE TABLE tablename ( field5 TEXT, field19 INTEGER );
insert into tablename (field5, field19) values
('Dr1', 1),
(null, 2), (null, 3),
('Td', 4),
('Td', 5), (null, 6), (null, 7),('Dr1', 8),(null, 9),('Td', 10),(null, 11),(null, 12);
Запрос № 1
select * from tablename;
| field5 | field19 |
| ------ | ------- |
| Dr1 | 1 |
| | 2 |
| | 3 |
| Td | 4 |
| Td | 5 |
| | 6 |
| | 7 |
| Dr1 | 8 |
| | 9 |
| Td | 10 |
| | 11 |
| | 12 |
Запрос № 2
select
coalesce(t.field5, (
select tt.field5 from tablename tt where tt.field19 = (
select max(tablename.field19) from tablename where tablename.field19 < t.field19 and tablename.field5 is not null)
)
) as field5,
t.field19
from tablename t;
| field5 | field19 |
| ------ | ------- |
| Dr1 | 1 |
| Dr1 | 2 |
| Dr1 | 3 |
| Td | 4 |
| Td | 5 |
| Td | 6 |
| Td | 7 |
| Dr1 | 8 |
| Dr1 | 9 |
| Td | 10 |
| Td | 11 |
| Td | 12 |