2016-06-22 11 views
-2

私は40万以上のデータを持つテーブルを持っています。問題はいくつかの列がNULLであることと、いくつかのルールに基づいて同じテーブルの値NULLを設定する必要があります。Oracle sqlは同じテーブルのNULL値を取り込みます

例 - 表は、4つの列がありますnametelephoneemailcity 、以下のようなデータ:上記列に名前、電話のように

name telephone email   city 
test 123      delhi 
test 123   [email protected]  

が同じで、我々は最初の行で電子メールを取り込むことができ2行目のデータと同様に1行目の2行目のデータを使用します。私はfirst_valueの機能について聞いたことがありますが、かなり遅いです。代替はありますか?

+0

参加を。しかし、あなたが実際に得た一致するレコードが同じ人物を表していることを確認する必要があります。また、可能な限り複数のマッチを得ることには注意が必要です。 –

答えて

0

あなたが述べたように、最も簡単なのはFIRST_VALUE()を使用することです:

SELECT name, 
     telephone, 
     FIRST_VALUE(email) IGNORE NULLS 
          OVER (PARTITION BY name, telephone) AS email, 
     FIRST_VALUE(city ) IGNORE NULLS 
          OVER (PARTITION BY name, telephone) AS city 
FROM table_name; 

あなたもMINまたはMAXFIRST_VALUEを置き換えることができます。

か、LAG()LEAD()と似たような行うことができます。

SELECT name, 
     telephone, 
     COALESCE(
     email, 
     LAG(email) IGNORE NULLS 
         OVER (PARTITION BY name, telephone 
           ORDER BY ROWNUM), 
     LEAD(email) IGNORE NULLS 
         OVER (PARTITION BY name, telephone 
           ORDER BY ROWNUM) 
     ) AS email, 
     COALESCE(
     email, 
     LAG(city ) IGNORE NULLS 
         OVER (PARTITION BY name, telephone 
          ORDER BY ROWNUM), 
     LEAD(city) IGNORE NULLS 
         OVER (PARTITION BY name, telephone 
          ORDER BY ROWNUM) 
     ) AS city 
FROM table_name; 
あなたはいつも自分を行うことができ
+0

回答がありがとう、私はそれが動作しないと思う人口の多い列が前または次でない場合 – Pran

+0

@Pranそれを試しましたか? 'IGNORE NULLS'は...まあ私はあなたが推測できると思う... – MT0

関連する問題