2017-05-07 57 views
1

我在谷歌BigQuery(不使用LegacySQL)工作,而且我正在嘗試將一個字符串作爲float64投射()。每次我收到錯誤「Bad double value」。我也嘗試過safe_cast(),但它完全消除了我的一些id(例如:如果一個客戶在3個不同的日期重複3次,並且對於單個「Height」條目只有'null',則該客戶在完成後我做safe_cast(),而不是隻有'null'值的行)。我的數據中沒有任何奇怪的字符串值,只是整個或合理的數字或空條目。谷歌BigQuery中的「糟糕的雙重價值」

這裏是我當前的代碼:

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

身高和體重(字符串)是什麼樣子?我能想到有問題的字符串;例如'NaN'或所謂的「subnormal」double值(小於1E-308),這是BigQuery可能會忽略的。更不用說像「REALLY TALL」那樣的高度字符串值了:-) – Mischa

回答

3

當然safe_cast()回報NULL的值。這是因爲你在數據中有不合適的值。

您可以通過執行找到這些:

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()不會返回空值,如果該客戶在一天內有一個空值,它將完全消除我的數據中的客戶ID。例如:如果一個客戶在3個不同的日期重複3次,並且只有一個「高度」輸入爲'null',那麼在我執行safe_cast()之後,它們將被消除。所有條目都是整數或有理數(即除'空'以外的其他內容)。 – cheesetaco

+0

@ksitt。 。 。當我在'select'中使用'safe_cast()'時,它會返回NULL值,並且不會過濾值 - 完全按照文檔中的說明進行操作。 –