Как использовать пользовательскую функцию SQL в снежинку? - PullRequest
0 голосов
/ 26 марта 2019

Я только изучаю, как использовать SQL в снежинке. Вот снимок:

enter image description here

И этот код используется здесь:

use schema SNOWFLAKE_SAMPLE_DATA.TPCH_SF1;
--use schema SNOWFLAKE_SAMPLE_DATA.TPCH_SF10;

select *
from LINEITEM
limit 200

Вы можете видеть, что таблица включает в себя две области: L_LINENUMBER, L_QUANTITY. Теперь я хочу попробовать пользовательскую функцию, которая может делать:

  1. использовать L_LINENUMBER, L_QUANTITY в качестве двух параметров, передаваемых в функцию,
  2. вычислить L_LINENUMBER1 = L_LINENUMBER + 1 и L_QUANTITY1 = среднее (L_QUANTITY).
  3. объединить два новых поля (L_LINENUMBER1, L_QUANTITY1) с исходной таблицей (LINEITEM)

как использовать функцию создания для этого. Я прочитал много примеров, касающихся создания функции. Но я просто не могу понять суть. Может быть, потому что я не очень хорош в SQL. Итак, кто-нибудь может дать мне исчерпывающий пример со всеми деталями?

1 Ответ

1 голос
/ 17 апреля 2019

Я понимаю, что ваш вопрос касается UDF, но использование UDF для ваших целей здесь излишне.

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

SELECT
    L_LINENUMBER+1 as L_LINENUMBER1
FROM LINEITEM;

Чтобы вычислить среднее значение атрибута в таблице, вы должны понимать, что это агрегатная функция, которая толькоимеет смысл при использовании в сочетании с оператором group by.Пример с вашими данными показан ниже.

SELECT
    AVG(L_QUANTITY) AS L_QUANTITY1
FROM LINEITEM
GROUP BY L_ORDERKEY;

Поскольку ваш вопрос изначально был о UDF, и вы, похоже, следите за примерами данных Snowflake, приведенный ими пример - следующий UDF, который принимает температуру в градусах Кельвина и преобразует ее в градусы Фаренгейта (изИз определения видно, что его можно применять к любому атрибуту числового типа).

CREATE OR REPLACE FUNCTION 
  UTIL_DB.PUBLIC.convert_fahrenheit( t NUMBER)
  RETURNS NUMBER
  COMMENT='Convert from Kelvin from Fahrenheit'
  AS '(t - 273.15) * 1.8000 + 32.00';
...