Я пытаюсь подсчитать, сколько переводов заняло более 30 минут, и эта ошибка продолжает появляться - PullRequest
0 голосов
/ 04 февраля 2020

Это формула, которую я написал ↓

count(if(avg(timestamp_diff(broker_delivery_date,request_datetime,minute)),0) >= 30,id,NULL)

И эта ошибка продолжает появляться ↓

Нет соответствующей сигнатуры для функции IF для типов аргументов: FLOAT64, INT64. Поддерживаемая подпись: ЕСЛИ (BOOL, ANY, ANY) в [10:10]

Ответы [ 3 ]

0 голосов
/ 04 февраля 2020
Для оператора

IF необходимо выражение boolean. Вы закрыли скобки не в том месте, как вы можете видеть ниже, и это привело к тому, что аргумент IF был FLOAT (результат AVG), а не выражение AVG(...) >= 30 как вы и ожидали.

count(
    if(
       avg(
           timestamp_diff(broker_delivery_date,request_datetime,minute)
          )
      ,0
      ) >= 30,id,NULL)

Что вы, вероятно, пытаетесь сделать, это:

count(
    if(
      avg(timestamp_diff(broker_delivery_date,request_datetime,minute)) >= 30
      ,id,NULL
      )
 )
0 голосов
/ 04 февраля 2020

У вас есть несколько проблем с этой конструкцией.

Во-первых, что такое ,0). Это не имеет смысла. Возможно, вы намереваетесь:

count(if(avg(timestamp_diff(broker_delivery_date, request_datetime, minute
                           )
            ) >= 30,
         id,   -- then
         NULL  -- else
     )

Что еще более важно, вы вкладываете функции агрегирования, а это недопустимо. Одна из возможностей заключается в том, что вы вообще не намерены avg(), а хотите только посмотреть на значения в одной строке. Это также можно упростить, используя countif():

countif(timestamp_diff(broker_delivery_date, request_datetime, minute
                      ) >= 30
       )

Я предполагаю, что это то, что вы действительно хотите.

0 голосов
/ 04 февраля 2020

Если ваш вопрос «Почему это происходит?»:

IF(BOOL, ANY, ANY)

требует трех параметров. Вы даете только два. Вот как это обрабатывается:

count(if(
         avg(timestamp_diff(broker_delivery_date,request_datetime,minute)),  <-- This is not a BOOL
         0  <-- This is the second parameter to if
         ) >= 30,  <-- This is a BOOL as the first parameter to count
      id,  <-- This is a second parameter to count
      NULL) <-- This is the third parameter to count

Попробуйте (Отказ от ответственности: не тестировалось):

count(if(avg(timestamp_diff(broker_delivery_date,request_datetime,minute)) >= 30,
         1,
         NULL)
      )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...