BigQuery - 将带分数转换为小数
BigQuery - Converting a mixed fraction to a decimal
如何使用 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)。
好的 - 我正在查看 Google 的 BigQuery,但它看起来很容易做到。第一个问题是"Are your numbers always separated by spaces?"。示例:“1 1/2”。如果是这样 - 使用 SPLIT 命令将其分成两个数字。 (即:“1”和“1/2”)。然后在第二部分使用拆分。 (所以 SPLIT(array[1], "/")。)然后您要做的就是将第二个数组的第一部分除以第二部分,然后将其添加到第一个数组的第一部分。我没有编写过这种语言,但看起来应该很简单。查看 https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions 以了解 BigQuery 的所有命令。 :-)
以下是 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)
如何使用 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)。
好的 - 我正在查看 Google 的 BigQuery,但它看起来很容易做到。第一个问题是"Are your numbers always separated by spaces?"。示例:“1 1/2”。如果是这样 - 使用 SPLIT 命令将其分成两个数字。 (即:“1”和“1/2”)。然后在第二部分使用拆分。 (所以 SPLIT(array[1], "/")。)然后您要做的就是将第二个数组的第一部分除以第二部分,然后将其添加到第一个数组的第一部分。我没有编写过这种语言,但看起来应该很简单。查看 https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions 以了解 BigQuery 的所有命令。 :-)
以下是 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)