Я анализирую данные желтых поездок в Нью-Йорк на такси автомобили 2018 года. (Вам нужен аккаунт Google BigQuery для доступа к этому набору данных.)

Схема говорит, что большинство столбцов являются числовыми. Однако, когда я попытался вычислить сумму ключевых долларовых значений (tip_amount, tolls_amount, total_amount), я получил сообщение об ошибке, в котором говорится, что они являются строковыми переменными.

SELECT sum(total_amount) 
FROM [bigquery-public-data:new_york_taxi_trips.tlc_yellow_trips_2018] 
WHERE month(dropoff_datetime) = 12

Error: Field total_amount is of type STRING which is not supported for SUM

Затем я попытался использовать функцию cast () для преобразования ее в числовую переменную, но это не сработало.

SELECT sum(total_amount_numeric) FROM 
(
     SELECT cast(total_amount as numeric) as total_amount_numeric 
     FROM [bigquery-public-data:new_york_taxi_trips.tlc_yellow_trips_2018]
     WHERE month(dropoff_datetime) = 12
)

Error: Field total_amount_numeric is of type STRING which is not supported for SUM

Как я могу анализировать эти числовые переменные, как я предполагал, вместо строковых переменных, поскольку они ошибочно установлены в базе данных?

1
Iterator516 21 Дек 2019 в 03:29

2 ответа

Лучший ответ

Ниже для BigQuery Standard SQL

#standardSQL
SELECT SUM(total_amount) 
FROM `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2018`
WHERE EXTRACT(MONTH FROM dropoff_datetime) = 12  

Проблема, с которой вы столкнулись, заключается в том, что тип данных NUMERIC не поддерживается устаревшим SQL BigQuery, а скорее обрабатывается как STRING и не может CAST ни FLOAT, ни INTEGER.

Итак, обходной путь заключается в использовании стандартного SQL BigQuery, как в приведенном выше примере - и, как вы видите здесь, вам не нужно выполнять какие-либо CAST'ы, так как это поле уже NUMERIC

1
Mikhail Berlyant 21 Дек 2019 в 01:06

Ваш запрос будет выполняться следующим образом в стандартном SQL:

SELECT sum(total_amount_numeric)  
FROM (SELECT cast(total_amount as numeric) as total_amount_numeric 
      FROM `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2018`
      WHERE EXTRACT(month FROM dropoff_datetime) = 12
     ) x;

Вы можете включить эту подсказку перед запросом, чтобы убедиться, что он выполняется с использованием стандартного SQL:

#standardSQL
1
Gordon Linoff 21 Дек 2019 в 00:39