2017-02-14 599 views
0

Может ли кто-нибудь показать мне способ, как это сделать?Как заполнить столбец ложными данными, где значение равно

Скажем, я получил следующий результат:

APP ¦ DAY ¦ PERCENT 
------------------------ 
JKL ¦ 2017-02-05 ¦ 
JKL ¦ 2017-02-06 ¦ 
JKL ¦ 2017-02-07 ¦ 78 
JKL ¦ 2017-02-08 ¦ 
JKL ¦ 2017-02-09 ¦ 64 
JKL ¦ 2017-02-10 ¦ 
JKL ¦ 2017-02-11 ¦ 
TZU ¦ 2017-02-05 ¦ 97 
TZU ¦ 2017-02-06 ¦ 
TZU ¦ 2017-02-07 ¦ 
TZU ¦ 2017-02-08 ¦ 24 
TZU ¦ 2017-02-09 ¦ 23 
TZU ¦ 2017-02-10 ¦ 
TZU ¦ 2017-02-11 ¦ 
UIO ¦ 2017-02-05 ¦ 
.. 
. 

Я хотел бы, чтобы преобразовать полученный результат в этом:

APP ¦ DAY ¦ PERCENT 
---------------------- 
JKL ¦ 2017-02-05 ¦ 100 
JKL ¦ 2017-02-06 ¦ 100 
JKL ¦ 2017-02-07 ¦ 78 
JKL ¦ 2017-02-08 ¦ 78 
JKL ¦ 2017-02-09 ¦ 64 
JKL ¦ 2017-02-10 ¦ 64 
JKL ¦ 2017-02-11 ¦ 64 
TZU ¦ 2017-02-05 ¦ 97 
TZU ¦ 2017-02-06 ¦ 97 
TZU ¦ 2017-02-07 ¦ 97 
TZU ¦ 2017-02-08 ¦ 24 
TZU ¦ 2017-02-09 ¦ 23 
TZU ¦ 2017-02-10 ¦ 23 
TZU ¦ 2017-02-11 ¦ 23 
UIO ¦ 2017-02-05 ¦ 100 
.. 
. 

Так что нужен какой-то код, который начинает проверять «APP» и пока последний «ДЕНЬ» не повторит предыдущее значение записи @ «PERCENT», если его пустая, начиная с 100, за исключением первой записи (на APP), была уже заполнена.

Заранее спасибо.

ответ

0

Для этого вы можете использовать the last_value() analytic function. Если текущее значение равно нулю, обратите внимание на последнее значение для app (который является пункт partition by) в хронологическом порядке (order by day), игнорируя любые аннулирует - так вы оглядываетесь назад за предыдущий ненулевое значение для app:

select app, to_char(day, 'YYYY-MM-DD') as day, 
    nvl(percent, last_value (percent ignore nulls) 
    over (partition by app order by day)) as percent 
from my_table 
order by app, day; 

APP DAY   PERCENT 
--- ---------- ---------- 
JKL 2017-02-05   
JKL 2017-02-06   
JKL 2017-02-07   78 
JKL 2017-02-08   78 
JKL 2017-02-09   64 
JKL 2017-02-10   64 
JKL 2017-02-11   64 
TZU 2017-02-05   97 
TZU 2017-02-06   97 
TZU 2017-02-07   97 
TZU 2017-02-08   24 
TZU 2017-02-09   23 
TZU 2017-02-10   23 
TZU 2017-02-11   23 
UIO 2017-02-05   

Я использую nvl(), но вы можете использовать case, если хотите. Для того, чтобы заполнить недостающие 100 значений вы можете использовать nvl() или case снова:

select app, to_char(day, 'YYYY-MM-DD') as day, 
    nvl(percent, nvl(last_value (percent ignore nulls) 
    over (partition by app order by day), 100)) as percent 
from my_table 
order by app, day; 

APP DAY   PERCENT 
--- ---------- ---------- 
JKL 2017-02-05  100 
JKL 2017-02-06  100 
JKL 2017-02-07   78 
JKL 2017-02-08   78 
JKL 2017-02-09   64 
JKL 2017-02-10   64 
JKL 2017-02-11   64 
TZU 2017-02-05   97 
TZU 2017-02-06   97 
TZU 2017-02-07   97 
TZU 2017-02-08   24 
TZU 2017-02-09   23 
TZU 2017-02-10   23 
TZU 2017-02-11   23 
UIO 2017-02-05  100 

Другие аналитические функции могут быть использованы вместо этого - lag(), или путем изменения порядка, lead() или first_value().

1

Первоначально вы можете установить первую строку в 100, если она имеет нулевое значение для данного приложения. Затем используйте LAG с опцией IGNORE NULLS, чтобы получить предыдущее ненулевое значение.

SELECT APP, 
     DT, 
     CASE WHEN NEW_PERCENT IS NOT NULL THEN NEW_PERCENT 
     ELSE LAG(NEW_PERCENT IGNORE NULLS) OVER(PARTITION BY APP ORDER BY DT) 
     END AS PERCENT 
FROM 
(SELECT T.*, 
     CASE WHEN ROW_NUMBER() OVER(PARTITION BY APP ORDER BY DT) = 1 AND PERCENT IS NULL THEN 100 
     ELSE PERCENT 
     END AS NEW_PERCENT 
    FROM T 
) X 

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

  • Нет связанных вопросов^_^