BigQuery-将混合分数转换为小数

时间:2018-08-29 19:58:47

标签: google-bigquery decimal fractions

如何使用BigQuery的标准SQL将这样的混合分数(“ 1 1/2”)转换为浮点值(1.5)?

有几个特殊情况的例子:1,1/2,1 1/2,1 1/2,1 1/2,1 1/2 IN,1 \ t1 / 2。

大量行(> 10M),较小的分数变化(> .5K)。

2 个答案:

答案 0 :(得分:2)

以下BigQuery标准SQL示例

#standardSQL
CREATE TEMP FUNCTION mix_to_float(str STRING) AS ((
  SELECT 
    IFNULL(SAFE_CAST(arr[SAFE_OFFSET(1)] AS INT64), 0) +
    CAST(SPLIT(arr[SAFE_OFFSET(0)], '/')[OFFSET(0)] AS INT64) / 
    CAST(SPLIT(arr[SAFE_OFFSET(0)], '/')[OFFSET(1)] AS INT64) 
  FROM (SELECT ARRAY_REVERSE(SPLIT(str, ' ')) arr)
));
WITH `project.dataset.table` AS (
  SELECT '1 1/2' mix UNION ALL
  SELECT '8/3'
)
SELECT mix, mix_to_float(mix) as_decimal
FROM `project.dataset.table`  

结果应为

Row     mix         as_decimal   
1       1 1/2       1.5  
2       8/3         2.6666666666666665     

以上假设字符串中至少包含小数部分。
只是快速的选择-很可能可以进一步优化:o)

答案 1 :(得分:0)

好的-我只是在看Google的BigQuery,但它看起来很容易做到。第一个问题是“您的数字是否总是用空格隔开?”。示例:“ 1 1/2”。如果是这样,请使用SPLIT命令将其分解为两个数字。 (即:“ 1”和“ 1/2”)。然后在第二部分上使用split。 (因此,SPLIT(array [1],“ /”)。)然后,您要做的就是将第二个数组的第一部分除以第二部分,然后将其添加到第一个数组的第一部分。我没有编程过这种语言,但是似乎应该很简单。在https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions中查找BigQuery的所有命令。 :-)