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



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

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

大量的行(>10M(,合理的少量分数变化(>.5K(。

下面是 BigQuery Standard 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(

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

最新更新