❄️

第3回Snowflake Rookies Camp ~FrostyFriday week5~

に公開

こんばんは!
Snowflake Rookies Camp幹事のhueです。
Snowflake Rookies Camp 第3回の勉強会ハンズオン予定のFrostyFriday Week5の回答例を確認できるように事前に準備しておきました。予習・復習にご利用ください!

FrostyFriday Week5の回答例

SYSADMINロールで作業を行いたいが、SYSADMIN単体ではcompute_whの利用権限が無いため
ACCOUNTADMIN→SYSADMINに権限を付与する

use role accountadmin;
grant usage on warehouse compute_wh to role sysadmin;

compute_whの利用権限を付与したら、SQLを実行するアカウントをSYSADMINに変更する

use role sysadmin;

クエリ実行時に使用するWarehouseをcompute_whに設定する

use warehouse compute_wh;

データベースをまず定義し、その中にスキーマ・テーブルを作成する

まずはデータベース作成し、スキーマを作成します(空っぽの枠だけ)

--データベース作成
create or replace database db_week5;
--スキーマ作成
create or replace schema schema_week5;

ダミーデータを作成

create or replace table table_week5(start_int number);
insert into table_week5(start_int)
select uniform(0,100,random()) as start_int
from table(generator(rowcount => 100));

作成したデータを確認します
データはランダムに入っています。
Order byを使用して数字を順にみます。

table table_week5 order by start_int;

UDF作成

それでは、UDFを作成します。
Rookies CampではPython・SQLをそれぞれ作成します。

Python

create or replace function x3_py(i number)
returns number
language python
runtime_version = '3.12'
handler = 'timesthree_py'
as
$$
def timesthree_py(i):
  return i*3
$$;

作成されたことを確認し、使用します。

select start_int,x3_py(start_int) as start_in_x3
from table_week5
order by start_int;

SQL

create or replace function x3_sql(i number)
returns number
language sql
as
$$
i*3
$$;

使用します

select start_int,x3_sql(start_int) as start_in_x3
from table_week5
order by start_int;

Rookies Campから出題!

問題:ユーザー定義関数(UDFs)を使って身長と体重からBMIを出しましょう。

BMIは以下の計算式を使って算出します。

体重(kg)÷{身長(m)の2乗}

身長と体重のデータを作成し、BMIを計測します

テーブルを作成し、ダミーデータを入れていきます

create or replace table table_week5_bmi (height number,weight number);
insert into table_week5_bmi (height,weight)
select 
    uniform(150,190,random()) as height,
    uniform(50,90,random()) as weight
from table(generator(rowcount => 100));

データの確認

table table_week5_bmi;

UDFの作成

Frosty Friday同様にPython・SQLをそれぞれ作成します

Python

create or replace function calc_bmi_python(height number, weight number)
returns number
language python
runtime_version = '3.12'
handler = 'calc_bmi'
as
$$
def calc_bmi(height,weight):
    return weight / ((height/100)** 2)
$$;

作成を確認し、使用します。
select height,weight,calc_bmi_python(height,weight)as BMI
from table_week5_bmi;

SQL

create or replace function calc_bmi_sql(height number, weight number)
returns number
language sql
as
$$
weight / ((height / 100)*(height / 100))
$$;

使ってみます

select height,weight,calc_bmi_sql(height,weight)as BMI
from table_week5_bmi;

PythonとSQLでは2乗の算出方法が違うので注意が必要です。

コード全文

Frosty Friday Week5

--権限付与
use role accountadmin;
grant usage on warehouse compute_wh to role sysadmin;
use role sysadmin;
use warehouse compute_wh;

--DB,SCHEMA,TABLE作成
create or replace database db_week5;
create or replace schema schema_week5;

--ダミーデータ作成
create or replace table table_week5(start_int number);
insert into table_week5(start_int)
select uniform(0,100,random()) as start_int
from table(generator(rowcount => 100));

table table_week5 order by start_int;--ネタ

--UDF作成
--Python
create or replace function x3_py(i number)
returns number
language python
runtime_version = '3.12'--ネタ
handler = 'timesthree_py'
as
$$
def timesthree_py(i):
  return i*3
$$;

--使ってみる
select start_int,x3_py(start_int) as start_in_x3
from table_week5
order by start_int;

--SQL
create or replace function x3_sql(i number)
returns number
language sql
as
$$
i*3
$$;

--使ってみる
select start_int,x3_sql(start_int) as start_in_x3
from table_week5
order by start_int;

BMI

--BMI問題
--ダミーデータ作成
create or replace table table_week5_bmi (height number,weight number);
insert into table_week5_bmi (height,weight)
select 
    uniform(150,190,random()) as height,
    uniform(50,90,random()) as weight
from table(generator(rowcount => 100));

table table_week5_bmi;

--UDF作成
--python
create or replace function calc_bmi_python(height number, weight number)
returns number
language python
runtime_version = '3.12'
handler = 'calc_bmi'
as
$$
def calc_bmi(height,weight):
    return weight / ((height/100)** 2)
$$
;

--使ってみよう
select height,weight,calc_bmi_python(height,weight)as BMI
from table_week5_bmi;

--sql
create or replace function calc_bmi_sql(height number, weight number)
returns number
language sql
as
$$
weight / ((height / 100)*(height / 100))
$$;

--使ってみよう
select height,weight,calc_bmi_sql(height,weight)as BMI
from table_week5_bmi;

Discussion