BigQuery - преобразование смешанной дроби в десятичную - PullRequest
0 голосов
/ 29 августа 2018

Как преобразовать смешанную дробь вроде этой '1 1/2' в значение с плавающей запятой (1.5), используя стандартный SQL BigQuery?

С несколькими примерами особых случаев: 1, 1/2, 1 1/2, 1 1/2, 1 1/2, 1 1/2 IN, 1 \ t1 / 2.

Большое количество строк (> 10M), достаточно небольшое количество вариаций дроби (> .5K).

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Ниже приведен пример для 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)

0 голосов
/ 29 августа 2018

Хорошо - я просто смотрю на Google BigQuery, но это выглядит довольно просто. Первый вопрос: «Ваши числа всегда разделены пробелами?». Пример: «1 1/2». Если это так - используйте команду SPLIT, чтобы разбить это на два числа. (то есть: «1» и «1/2»). Затем вы используете сплит во второй части. (Таким образом, SPLIT (array [1], "/").) Затем все, что вам нужно сделать, это разделить первую часть второго массива на вторую часть, а затем добавить ее в первую часть первого массива. Я не программировал этот язык, но, кажется, это должно быть очень просто сделать. Посмотрите на https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions для всех команд BigQuery. : -)

...