BigQuery Стандартный SQL: передать INTERVAL или date_part в качестве аргумента UDF SQL? - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь создать простой TIMESTAMP_AGO SQL UDF.Функция представляет собой простую обертку вокруг CURRENT_TIMESTAMP и TIMESTAMP_SUB.

Я хочу вызвать ее с подписью:

SELECT TIMESTAMP_AGO(24, 'HOUR');

или даже:

SELECT TIMESTAMP_AGO(24 HOUR);

Но BigQuery, похоже, не любит date_part из INTERVAL как переменную, поэтому он терпит неудачу.Я попытался разделить аргументы:

CREATE TEMP FUNCTION TIMESTAMP_AGO(_interval INT64, _date_part STRING) AS ((

  SELECT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval _date_part)

));

и, пытаясь передать ИНТЕРВАЛ:

CREATE TEMP FUNCTION TIMESTAMP_AGO(_interval INTERVAL) AS ((

  SELECT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), _interval)

));
  • Может ли INTERVAL передаваться какэтот?
  • Или, возможно ли передать динамический date_part?
  • В противном случае можно ли будет использовать внешний UDF (JS)?

1 Ответ

0 голосов
/ 24 февраля 2019

Ниже для BigQuery Standard SQL

TIMESTAMP_SUB поддерживает следующие значения для date_part:

  • MICROSECOND
  • MILLISECOND
  • SECOND
  • МИНУТА
  • ЧАС

Итак, вам просто нужно проверить ваш пройденный _date_part и использовать соответствующую «версию», как в примере ниже

#standardSQL
CREATE TEMP FUNCTION TIMESTAMP_AGO(_interval INT64, _date_part STRING) AS (
  CASE _date_part
    WHEN 'MICROSECOND' THEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval MICROSECOND) 
    WHEN 'MILLISECOND' THEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval MILLISECOND) 
    WHEN 'SECOND' THEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval SECOND) 
    WHEN 'MINUTE' THEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval MINUTE) 
    WHEN 'HOUR' THEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval HOUR)     
  END
);

Итак, теперь ниже будет работать

SELECT TIMESTAMP_AGO(24, 'HOUR')   

Очевидно, что вы можете добавить UPPER() к CASE _date_part, если вы ожидаете ввод без учета регистра и т. Д.

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