Google BigQuery Sum возвращает неверный результат - PullRequest
0 голосов
/ 22 октября 2018

Ребята, я запускаю этот запрос на общедоступных данных блокчейна, чтобы получить общее количество сожженных токенов.Но СУММА возвращает результат намного меньше, чем реальный (выполнить тот же запрос без суммы и запустить сумму в Pandas).это дает 8306, в то время как панды 328608.

log.data - шестнадцатеричное число

SELECT
  SUM(SAFE_CAST(log.data as INT64)/POW(10,18))
FROM
  `bigquery-public-data.ethereum_blockchain.logs` AS log
WHERE TRUE
  AND log.address = '0xf53ad2c6851052a81b42133467480961b2321c09'
  AND log.block_timestamp >= '2018-01-01 00:00:01'
  AND log.block_timestamp <= '2018-12-01 00:00:01'
  AND SUBSTR(log.topics[SAFE_OFFSET(0)], 1, 10) IN ('0x42696c68','0xcc16f5db')

Я не совсем понимаю, почему это происходит.Буду признателен за ответ)

1 Ответ

0 голосов
/ 22 октября 2018

Проблема в том, что некоторые значения log.data исключаются из SUM, поскольку они не укладываются в диапазон INT64 и, следовательно, SAFE_CAST(log.data AS INT64) возвращает NULL.Например, 0x00000000000000000000000000000000000000000000000080b7978da47c78d2 больше, чем максимальное INT64 значение 9223372036854775807, равное 0x7FFFFFFFFFFFFFFF в шестнадцатеричном формате.

Вместо этого можно привести значения log.data к типу FLOAT64, который дает результат ближе к тому, что вы видите, используя Pandas:

SELECT
  SUM(CAST(log.data as FLOAT64)/POW(10,18))
FROM
  `bigquery-public-data.ethereum_blockchain.logs` AS log
WHERE TRUE
  AND log.address = '0xf53ad2c6851052a81b42133467480961b2321c09'
  AND log.block_timestamp >= '2018-01-01 00:00:01'
  AND log.block_timestamp <= '2018-12-01 00:00:01'
  AND SUBSTR(log.topics[SAFE_OFFSET(0)], 1, 10) IN ('0x42696c68','0xcc16f5db')

Это возвращает 329681.7942642243.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...