Значения обратной засыпки на основе других значений столбца - PullRequest
0 голосов
/ 29 июня 2018

Что у меня есть

customerid   status_1 status_2 status_3 status_4 status_5

Ax             1         0         0        0        0
Bx             0         0         1        0        0
Cx             0         0         0        0        1
Dx             0         0         0        1        0
Ex             0         1         0        0        0

Я хочу заполнить значения в столбцах на основе значения другого столбца

  1. если status_1 = 1, то status_2, status_3, status_4 и status_5 должны быть 0.

  2. если status_2 = 1, то status_1 должно быть 1, а status_3, status_4 и status_5 должно быть 0.

  3. если status_3 = 1, то status_1 & status 2 должно быть 1, а status_4 и status_5 должны быть 0.

  4. если status_4 = 1, то status_1, status 2 и status 5 должны быть 1, а status_3 должен быть 0.

  5. если status_5 = 1, тогда status_1, status_2, status_3 & status_4 должны быть равны 1.

Вывод выглядит как ниже

 customerid   status_1 status_2 status_3 status_4 status_5

Ax         1         0         0        0        0
Bx         1         1         1        0        0
Cx         1         1         1        1        1
Dx         1         1         0        1        1
Ex         1         1         0        0        0

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Ниже приведен запрос BACKFILL , который даст желаемый результат.

Также следующий запрос требует меньше изменений при добавлении новых столбцов ex.status6, status7, status8, ...

«Добавить» и «или» в select добавляются, когда столбец требует ИСКЛЮЧЕНИЯ как status_4

И так как status_1 всегда равен 1, в вашем случае вы можете заменить (1 <= pos.one) на 1 </p>

    with your_table(customerid,status_1,status_2,status_3,status_4,status_5) as (
    select *
    from (
      values
        ('AX',1,0,0,0,0),
        ('BX',0,0,1,0,0),
        ('CX',0,0,0,0,1),
        ('DX',0,0,0,1,0),
        ('EX',0,1,0,0,0)
     ) t
    )
    select
     customerid,
     (1&lt=pos.one)::int as status1,
     (2&lt=pos.one)::int as status2,
     (3&lt=pos.one and pos.one!=4)::int as status3,
     (4&lt=pos.one)::int as status4,
     (5&lt=pos.one or pos.one=4)::int as status5
    from
    your_table t,
    lateral
    (
     select position('1' in t.status_1::text||t.status_2||t.status_3||t.status_4||t.status_5) as one
    ) pos
0 голосов
/ 29 июня 2018

Попробуйте это:

select customer_id,
    case when status_5 = 1 or status_4 = 1 or status_3 = 1 or status_2 = 1 or status_1 = 1 then 1 else 0 end as status_1,
    case when status_5 = 1 or status_4 = 1 or status_3 = 1 or status_2 = 1 then 1 else 0 end as status_2,
    case when status_5 = 1 or status_3 = 1 then 1 else 0 end as status_3,
    case when status_5 = 1 or status_4 = 1 then 1 else 0 end as status_4,
    case when status_5 = 1 or status_4 = 1 then 1 else 0 end as status_5
from your_table;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...