2017-02-14 5 views
0

誰かが私にこの方法を教えてもらえますか?値がnullの模擬データで列を記入する方法

のは、私は次のような結果持っているとしましょう:

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"と最後の "DAY"までは、最初のエントリ(APPごと)が既に記入されていることを除いて、100で始まる空の場合は前のレコード値@ "PERCENT"を繰り返す。

ありがとうございます。

答えて

0

これを実現するにはthe last_value() analytic functionを使用できます。現在の値がnullの場合、任意のヌルを無視して、日付順で(order by day)(partition by句です)appための最後の値を探してください - あなたは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

最初の行は、指定されたアプリに対してnull値がある場合は最初に100に設定できます。次に、LAGIGNORE NULLSオプションを使用して、以前のNULL以外の値を取得します。

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 
関連する問題