Как sqlite заменить ноль с предыдущим значением - PullRequest
0 голосов
/ 10 января 2019

Таблица этого:

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 я не нашел решения. Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете использовать это, чтобы найти предыдущее не 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      |

Просмотр на БД Fiddle

0 голосов
/ 10 января 2019

Оконная функция поможет:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...