2017-05-07 129 views
1

Google BigQuery(LegacySQLは使用していません)で作業しています。現在、文字列をfloat64としてキャストしようとしています。私はエラー "Bad double value"を得るたびに。私もsafe_cast()を試しましたが、私のIDの一部を完全に削除しました(例:ある顧客が3つの異なる日付に対して3回繰り返し、単一の「高さ」エントリに対して「null」しかない場合、私は 'null'の値を持つ行だけでなく、safe_cast()を実行します。私は自分のデータに奇妙な文字列の値はありません。ちょうど全体または有理数またはヌルエントリです。もちろんsafe_cast()戻りNULL値のGoogle BigQueryの「bad double value」

select id, date,   
     cast(height as float64) as height,  
     cast(weight as float64) as weight 
from (select id, date, max(height) as height, max(weight) as weight 
     from table  
     group by 1,2 
    ) 
group by 1, 2 
+0

高さと重さ(文字列)はどのように見えますか?問題のある文字列を考えることができます。例えばBigQueryがボークする可能性のある「NaN」またはいわゆる「準正常」の二重値(1E-308未満) "REALLY TALL"のような高さの文字列の値は言うまでもありません: – Mischa

答えて

3

は、ここに私の現在のコードです。これは、データに不適切な値があるためです。

あなたが行うことで、これらのを見つけることができます:あなたは値が何であるかを理解すれば、値を修正したり、クエリのロジックを調整

select height, weight 
from table 
where safe_cast(height) is null or safe_cast(weight) is null; 

あなただけの値の最大値が正しく数値でいるしたい場合は、集約前にキャスト:

select id, date, 
     max(safe_cast(height as float64)) as height, 
     max(safe_cast(weight as float64)) as weight 
from table  
group by 1, 2; 

をサブクエリは、クエリのために必要または望ましいようではありません。

+0

safe_cast()はnull値を返さず、その顧客が1日のnull値を持つ場合、データ内の顧客IDを完全に削除します。例:ある顧客が3つの異なる日付に対して3回繰り返され、1つの「高さ」項目に対して「null」しかない場合、safe_cast()を実行すると削除されます。すべてのエントリは、整数または有理数のいずれかである(すなわち、「ヌル」以外の何もない)。 – cheesetaco

+0

@ksitt。 。 。 'select'で' safe_cast() 'を使うと' NULL'を返し、値のフィルタリングはしません。 –

関連する問題