0% found this document useful (0 votes)
9 views6 pages

SQL_CODE

Uploaded by

Shreyas Shetty
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
9 views6 pages

SQL_CODE

Uploaded by

Shreyas Shetty
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 6

USE DATABASE SCD_DB;

USE SCHEMA SCD_SC;

CREATE OR REPLACE TABLE CUSTOMER (


CUSTOMER_ID NUMBER,
FIRST_NAME VARCHAR,
LAST_NAME VARCHAR,
EMAIL VARCHAR,
STREET VARCHAR,
CITY VARCHAR,
STATE VARCHAR,
COUNTRY VARCHAR,
UPDATE_TIMESTAMP TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP()
);

CREATE OR REPLACE TABLE CUSTOMER_HISTORY (


CUSTOMER_ID NUMBER,
FIRST_NAME VARCHAR,
LAST_NAME VARCHAR,
EMAIL VARCHAR,
STREET VARCHAR,
CITY VARCHAR,
STATE VARCHAR,
COUNTRY VARCHAR,
START_TIME TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP(),
END_TIME TIMESTAMP_NTZ DEFAULT CURRENT_TIMESTAMP(),
IS_CURRENT BOOLEAN
);

CREATE OR REPLACE TABLE CUSTOMER_RAW (


CUSTOMER_ID NUMBER,
FIRST_NAME VARCHAR,
LAST_NAME VARCHAR,
EMAIL VARCHAR,
STREET VARCHAR,
CITY VARCHAR,
STATE VARCHAR,
COUNTRY VARCHAR
);

CREATE OR REPLACE STREAM CUSTOMER_TABLE_CHANGES ON TABLE CUSTOMER;

CREATE OR REPLACE STORAGE INTEGRATION S3_CONN


TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = S3
ENABLED = TRUE
STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::837934442683:role/snowflake_s3_conn'
STORAGE_ALLOWED_LOCATIONS = ('s3://snowflake-project-shrey')
COMMENT = 'Creating connection to s3'

DESC INTEGRATION S3_CONN

CREATE OR REPLACE FILE FORMAT SCD_DB.SCD_SC.CSV_FILE_FORMAT


TYPE = 'CSV'
FIELD_DELIMITER = ','
SKIP_HEADER = 1
NULL_IF = ('NULL', 'null')
EMPTY_FIELD_AS_NULL = TRUE;
CREATE OR REPLACE STAGE SCD_DB.SCD_SC.CUSTOMER_EXT_STAGE
URL = ''
STORAGE_INTEGRATION = S3_CONN
FILE_FORMAT = SCD_DB.SCD_SC.CSV_FILE_FORMAT;

LIST @SCD_DB.SCD_SC.CUSTOMER_EXT_STAGE;

CREATE OR REPLACE PIPE CUSTOMER_RAW_S3_PIPE


AUTO_INGEST = TRUE
AS
COPY INTO CUSTOMER_RAW
FROM @SCD_DB.SCD_SC.CUSTOMER_EXT_STAGE
FILE_FORMAT = SCD_DB.SCD_SC.CSV_FILE_FORMAT;

SHOW PIPES; --TO GET THE SQS NOTIFICATION_CHANNEL

SELECT SYSTEM$PIPE_STATUS('CUSTOMER_RAW_S3_PIPE');

MERGE INTO CUSTOMER C


USING CUSTOMER_RAW CR
ON C.CUSTOMER_ID = CR.CUSTOMER_ID
WHEN MATCHED AND ( C.CUSTOMER_ID <> CR.CUSTOMER_ID OR
C.FIRST_NAME <> CR.FIRST_NAME OR
C.LAST_NAME <> CR.LAST_NAME OR
C.EMAIL <> CR.EMAIL OR
C.STREET <> CR.STREET OR
C.CITY <> CR.CITY OR
C.STATE <> CR.STATE OR
C.COUNTRY <> CR.COUNTRY) THEN UPDATE
SET C.CUSTOMER_ID = CR.CUSTOMER_ID,
C.FIRST_NAME = CR.FIRST_NAME,
C.LAST_NAME = CR.LAST_NAME,
C.EMAIL = CR.EMAIL,
C.STREET = CR.STREET,
C.CITY = CR.CITY,
C.STATE = CR.STATE,
C.COUNTRY = CR.COUNTRY,
UPDATE_TIMESTAMP = CURRENT_TIMESTAMP()
WHEN NOT MATCHED THEN
INSERT (C.CUSTOMER_ID, C.FIRST_NAME, C.LAST_NAME, C.EMAIL, C.STREET, C.CITY,
C.STATE, C.COUNTRY)
VALUES (CR.CUSTOMER_ID, CR.FIRST_NAME, CR.LAST_NAME, CR.EMAIL, CR.STREET,
CR.CITY, CR.STATE, CR.COUNTRY);

CREATE OR REPLACE PROCEDURE PDR_SCD()


RETURNS STRING NOT NULL
LANGUAGE JAVASCRIPT
AS
$$
var cmd = `MERGE INTO CUSTOMER C
USING CUSTOMER_RAW CR
ON C.CUSTOMER_ID = CR.CUSTOMER_ID
WHEN MATCHED AND ( C.CUSTOMER_ID <> CR.CUSTOMER_ID OR
C.FIRST_NAME <> CR.FIRST_NAME OR
C.LAST_NAME <> CR.LAST_NAME OR
C.EMAIL <> CR.EMAIL OR
C.STREET <> CR.STREET OR
C.CITY <> CR.CITY OR
C.STATE <> CR.STATE OR
C.COUNTRY <> CR.COUNTRY) THEN
UPDATE
SET C.CUSTOMER_ID = CR.CUSTOMER_ID,
C.FIRST_NAME = CR.FIRST_NAME,
C.LAST_NAME = CR.LAST_NAME,
C.EMAIL = CR.EMAIL,
C.STREET = CR.STREET,
C.CITY = CR.CITY,
C.STATE = CR.STATE,
C.COUNTRY = CR.COUNTRY,
UPDATE_TIMESTAMP = CURRENT_TIMESTAMP()
WHEN NOT MATCHED THEN
INSERT (C.CUSTOMER_ID, C.FIRST_NAME, C.LAST_NAME, C.EMAIL, C.STREET, C.CITY,
C.STATE, C.COUNTRY)
VALUES (CR.CUSTOMER_ID, CR.FIRST_NAME, CR.LAST_NAME, CR.EMAIL, CR.STREET,
CR.CITY, CR.STATE, CR.COUNTRY);`

var cmd1 = "truncate table SCD_DEMO.SCD2.customer_raw;"


var sql = snowflake.createStatement({sqlText: cmd});
var sql1 = snowflake.createStatement({sqlText: cmd1});
var result = sql.execute();
var result1 = sql1.execute();
return cmd+'\n'+cmd1;
$$;

CALL PROCEDURE PDR_SCD();

-- SET UP TASKADMIN ROLE


USE ROLE SECURITYADMIN;
CREATE OR REPLACE ROLE TASKADMIN;

-- SET THE ACTIVE ROLE TO ACCOUNTADMIN BEFORE GRANTING THE EXECUTE TASK PRIVILEGE
TO TASKADMIN
USE ROLE ACCOUNTADMIN;
GRANT EXECUTE TASK ON ACCOUNT TO ROLE TASKADMIN;

-- SET THE ACTIVE ROLE TO SECURITYADMIN TO SHOW THAT THIS ROLE CAN GRANT A ROLE TO
ANOTHER ROLE
USE ROLE SECURITYADMIN;
GRANT ROLE TASKADMIN TO ROLE SYSADMIN;

CREARTE OR REPLACE TASK TSK_SCD_RAW WAREHOUSE = COMPUTE_WH SCHEDULE = '1 MINUTE'


ERROR_ON_NONDETERMINISTIC_MERGE=FALSE
as
CALL PROCEDURE PDR_SCD();

SHOW TASKS;

ALTER TASK TSK_SCD_RAW SUSPEND; -- RESUME -- SUSPEND

SELECT TIMESTAMPDIFF(SECOND, CURRENT_TIMESTAMP, SCHEDULED_TIME) AS NEXT_RUN,


SCHEDULED_TIME, CURRENT_TIMESTAMP, NAME, STATE
FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY())
WHERE STATE = 'SCHEDULED'
ORDER BY COMPLETED_TIME DESC;

--STREAM

SELECT * FROM CUSTOMER_TABLE_CHANGES;

INSERT INTO CUSTOMER VALUES (223136, 'JESSICA', 'ARNOLD', '[email protected]',


'595 BENJAMIN FORGE SUITE 124', 'MICHAELSTAD', 'CONNECTICUT', 'CAPE VERDE',
CURRENT_TIMESTAMP());

UPDATE CUSTOMER
SET FIRST_NAME = 'JESSICA', UPDATE_TIMESTAMP = CURRENT_TIMESTAMP()::TIMESTAMP_NTZ
WHERE CUSTOMER_ID = 72;

DELETE FROM CUSTOMER WHERE CUSTOMER_ID = 73;

SELECT * FROM CUSTOMER_HISTORY WHERE CUSTOMER_ID IN (72, 73, 223136);

SELECT * FROM CUSTOMER_TABLE_CHANGES;

SELECT * FROM CUSTOMER WHERE CUSTOMER_ID IN (72, 73, 223136);

--VIEW CREATION--

CREATE OR REPLACE VIEW V_CUSTOMER_CHANGE_DATA AS


-- This subquery figures out what to do when data is inserted into the customer
table
-- An insert to the customer table results in an INSERT to the customer_HISTORY
table
SELECT CUSTOMER_ID, FIRST_NAME, LAST_NAME, EMAIL, STREET,
CITY,STATE,COUNTRY,START_TIME,END_TIME,IS_CURRENT,
'I' AS DML_TYPE
FROM
(SELECT CUSTOMER_ID, FIRST_NAME, LAST_NAME, EMAIL, STREET,
CITY,STATE,COUNTRY,UPDATE_TIMESTAMP AS START_TIME,
LAG(UPDATE_TIMESTAMP) OVER (PARTITION BY CUSTOMER_ID ORDER BY UPDATE_TIMESTAMP
DESC) AS END_TIME_RAW,
CASE WHEN END_TIME_RAW IS NULL THEN '9999-12-31'::TIMESTAMP_NTZ ELSE
END_TIME_RAW END AS END_TIME,
CASE WHEN END_TIME_RAW IS NULL THEN TRUE ELSE FALSE END AS IS_CURRENT
FROM
(SELECT CUSTOMER_ID, FIRST_NAME, LAST_NAME, EMAIL, STREET,
CITY,STATE,COUNTRY,UPDATE_TIMESTAMP
FROM SCD_DB.SCD_SC.CUSTOMER_TABLE_CHANGES
WHERE metadata$action = 'INSERT'AND metadata$isupdate = 'FALSE'))
UNION

-- This subquery figures out what to do when data is updated in the customer table
-- An update to the customer table results in an update AND an insert to the
customer_HISTORY table
-- The subquery below generates two records, each with a different dml_type
SELECT CUSTOMER_ID, FIRST_NAME, LAST_NAME, EMAIL, STREET, CITY, STATE, COUNTRY,
UPDATE_TIMESTAMP AS START_TIME,
LAG(UPDATE_TIMESTAMP) OVER (PARTITION BY CUSTOMER_ID ORDER BY UPDATE_TIMESTAMP
DESC) AS END_TIME_RAW,
CASE WHEN END_TIME_RAW IS NULL THEN '9999-12-31'::TIMESTAMP_NTZ ELSE END_TIME_RAW
END AS END_TIME,
CASE WHEN END_TIME_RAW IS NULL THEN TRUE ELSE FALSE END AS IS_CURRENT, DML_TYPE
FROM(-- Identify data to insert into customer_history table
SELECT CUSTOMER_ID, FIRST_NAME, LAST_NAME, EMAIL, STREET,
CITY,STATE,COUNTRY, update_timestamp, 'I' as DML_TYPE
FROM customer_table_changes
WHERE metadata$action = 'INSERT'
AND metadata$isupdate = 'TRUE'
UNION
-- Identify data in customer_HISTORY table that needs to be updated
SELECT CUSTOMER_ID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, START_TIME,
'U' AS DML_TYPE
FROM CUSTOMER_HISTORY
WHERE CUSTOMER_ID IN
(SELECT DISTINCT CUSTOMER_ID
FROM CUSTOMER_TABLE_CHANGES
WHERE metadata$action = 'DELETE'
AND metadata$isupdate = 'TRUE')
AND IS_CURRENT = TRUE))
UNION
-- This subquery figures out what to do when data is deleted from the customer
table
-- A deletion from the customer table results in an update to the customer_HISTORY
table
SELECT CTC.CUSTOMER_ID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, CH.START_TIME,
CURRENT_TIMESTAMP()::TIMESTAMP_NTZ,
NULL, 'D' AS DML_TYPE
FROM
CUSTOMER_HISTORY CH
INNER JOIN CUSTOMER_TABLE_CHANGES CTC
ON CH.CUSTOMER_ID = CTC.CUSTOMER_ID
WHERE CTC.metadata$action = 'DELETE'
AND CTC.metadata$isupdate = 'FALSE'
AND CH.IS_CURRENT = TRUE;

SELECT * FROM V_CUSTOMER_CHANGE_DATA;

CREATE OR REPLACE TASK TSK_SCD_HIST WAREHOUSE = COMPUTE_WH SCHEDULE = '1 MINUTE'


ERROR_ON_NONDETERMINISTIC_MERGE=FALSE
AS
MERGE INTO CUSTOMER_HISTORY CH --Target table to merge changes from NATION into
USING V_CUSTOMER_CHANGE_DATA CCD --v_customer_change_data is a view that holds the
logic that determines what to insert/update into the customer_history table.
ON CH.CUSTOMER_ID = CCD.CUSTOMER_ID
AND CH.START_TIME = CCDE.START_TIME
WHEN MATCHED AND CCD.DML_TYPE = 'U'
THEN UPDATE
SET CH.END_TIME = CCD.END_TIME,
CH.IS_CURRENT = FALSE
WHEN MATCHED AND CCD.DML_TYPE = 'D'
THEN UPDATE
SET CH.END_TIME = CCD.END_TIME,
CH.IS_CURRENT = FALSE
WHEN NOT MATCHED AND CCD.DML_TYPE = 'I'
THEN INSERT (CUSTOMER_ID, FIRST_NAME, LAST_NAME, EMAIL, STREET, CITY, STATE,
COUNTRY, START_TIME, END_TIME, IS_CURRENT)
VALUES (CCD.CUSTOMER_ID, CCD.FIRST_NAME, CCD.LAST_NAME, CCD.EMAIL, CCD.STREET,
CCD.CITY, CCD.STATE, CCD.COUNTRY, CCD.START_TIME, CCD.END_TIME, CCD.IS_CURRENT);
SHOW TASKS;

ALTER TASK TSK_SCD_HIST SUSPEND; --RESUME

INSERT INTO CUSTOMER VALUES(223136,'Jessica','Arnold','[email protected]','595


Benjamin Forge Suite 124','Michaelstad','Connecticut','Cape
Verde',CURRENT_TIMESTAMP());

UPDATE CUSTOMER SET FIRST_NAME='Jessica' WHERE CUSTOMER_ID=7523;

DELETE FROM CUSTOMER WHERE CUSTOMER_ID =136 AND FIRST_NAME = 'Kim';

SELECT COUNT(*),CUSTOMER_ID FROM CUSTOMER GROUP BY CUSTOMER_ID HAVING COUNT(*)=1;

SELECT * FROM CUSTOMER_HISTORY WHERE CUSTOMER_ID =223136;

SELECT * FROM CUSTOMER_HISTORY WHERE IS_CURRENT=TRUE;

--ALTER WAREHOUSE SUSPEND;


SELECT TIMESTAMPDIFF(SECOND, CURRENT_TIMESTAMP, SCHEDULED_TIME) AS NEXT_RUN,
SCHEDULED_TIME, CURRENT_TIMESTAMP, NAME, STATE
FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY()) WHERE STATE = 'SCHEDULED' ORDER BY
COMPLETED_TIME DESC;

SELECT * FROM CUSTOMER_HISTORY WHERE IS_CURRENT=FALSE;

SHOW TASKS;

You might also like