diff --git a/README.md b/README.md deleted file mode 100644 index 545e9bf3a..000000000 --- a/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Analytics engineering with dbt - -Template repository for the projects and environment of the course: Analytics engineering with dbt - -> Please note that this sets some environment variables so if you create some new terminals please load them again. - -## License - -Apache 2.0 diff --git a/greenery/.gitignore b/greenery/.gitignore new file mode 100644 index 000000000..49f147cb9 --- /dev/null +++ b/greenery/.gitignore @@ -0,0 +1,4 @@ + +target/ +dbt_packages/ +logs/ diff --git a/greenery/README.md b/greenery/README.md new file mode 100644 index 000000000..fcc7d3cf1 --- /dev/null +++ b/greenery/README.md @@ -0,0 +1,164 @@ +# WEEK 3 + + + +## PART 1 +** What is ur overall cnversion rate? + +````sql +with conversion_rate as +( +select +product_id, +name, +cast(count(distinct (case when event_type='add_to_cart' then session_id end)) as float) as check_out, +cast(count(distinct session_id) as float) as sessions + +from +dbt.dbt_sofia.stg_greenery_events +left join dbt.dbt_sofia.stg_greenery_products using( product_id) + +group by 1,2 ) + +select +product_id, +name, +sum(check_out)/sum(sessions) as cr from conversion_rate +group by 1,2 +```` +** What is ur overall cnversion rate by product? +````slq + +with conversion_rate as +( +select +product_id, +name, +cast(count(distinct (case when event_type='add_to_cart' then session_id end)) as float) as check_out, +cast(count(distinct session_id) as float) as sessions + +from +dbt.dbt_sofia.stg_greenery_events +left join dbt.dbt_sofia.stg_greenery_products using( product_id) + +group by 1,2 ) + +select +product_id, +name, +sum(check_out)/sum(sessions) as cr from conversion_rate +group by 1,2 +```` + +image + +*** PART 2 +macro used in models/mart/product/event_type_per_sesssion.sql +````sql +{% macro get_column_values(column_name, relation) %} + +{% set relation_query %} +select distinct +{{ column_name }} +from {{ relation }} +order by 1 +{% endset %} + +{% set results = run_query(relation_query) %} + +{% if execute %} +{% set results_list = results.columns[0].values() %} +{% else %} +{% set results_list = [] %} +{% endif %} + +{{ return(results_list) }} + +{% endmacro %} + + +{% macro get_payment_methods() %} + +{{ return(get_column_values('event_type', ref('stg_greenery_events'))) }} + +{% endmacro %} +```` +***PART 4 +macro used in models/mart/product/event_type_per_sesssion_version2.sql +````sql +{%- set event_types = dbt_utils.get_column_values( + table=ref('stg_greenery_events'), + column='event_type' +) -%} + +select +session_id, +{%- for event_type in event_types %} +sum(case when event_type = '{{event_type}}' then 1 end) as {{event_type}}_count +{%- if not loop.last %},{% endif -%} +{% endfor %} +from {{ ref('stg_greenery_events') }} +group by 1 + +```` +# WEEK 4 + +## PART1 +````sql +{% snapshot orders_snapshot%} +{{ + config( + target_schema='snapshots' + , strategy= 'check' + ,unique_key= 'order_id' + , check_cols=['status'] + ) +}} + +select * from {{ source ('src_greenery','orders')}} + +{% endsnapshot %} +```` +## PART 2 +Usng greeneery/models/mart/product/intermidiate/init_funnel.sql +and greeneery/models/mart/product/intermidiate/fct_funnel.sql + +How are our users moving through the product funnel? + +image + +Which steps in the funnel have largest drop off points? + +- from first to second + +### exposures: +````sql +version: 2 + +exposures: + + - name: tableu_dash + type: dashboard + maturity: medium + url: https://tableau.io + description: > + all of the data + depends_on: + - ref('fct_funnel') + + owner: + name: sofi + email: sofi.svs.96@gmail.com + +```` + +## Part3 + +- My company is already implementing dbt , but is not ready yet. I think the combination of jinja and macros can automate a lot of things and give us a lot of independance. + +### Resources: +- Learn more about dbt [in the docs](https://docs.getdbt.com/docs/introduction) +- Check out [Discourse](https://discourse.getdbt.com/) for commonly asked questions and answers +- Join the [chat](https://community.getdbt.com/) on Slack for live discussions and support +- Find [dbt events](https://events.getdbt.com) near you +- Check out [the blog](https://blog.getdbt.com/) for the latest news on dbt's development and best practices diff --git a/greenery/analyses/.gitkeep b/greenery/analyses/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/greenery/dbt_project.yml b/greenery/dbt_project.yml new file mode 100644 index 000000000..b695c572f --- /dev/null +++ b/greenery/dbt_project.yml @@ -0,0 +1,46 @@ + +# Name your project! Project names should contain only lowercase characters +# and underscores. A good package name should reflect your organization's +# name or the intended use of these models +name: 'greenery' +version: '1.0.0' +config-version: 2 + +# This setting configures which "profile" dbt uses for this project. +profile: 'greenery' + +# These configurations specify where dbt should look for different types of files. +# The `model-paths` config, for example, states that models in this project can be +# found in the "models/" directory. You probably won't need to change these! +model-paths: ["models"] +analysis-paths: ["analyses"] +test-paths: ["tests"] +seed-paths: ["seeds"] +macro-paths: ["macros"] +snapshot-paths: ["snapshots"] + +target-path: "target" # directory which will store compiled SQL files +clean-targets: # directories to be removed by `dbt clean` + - "target" + - "dbt_packages" + + +# Configuring models +# Full documentation: https://docs.getdbt.com/docs/configuring-models + +# In this example config, we tell dbt to build all models in the example/ directory +# as tables. These settings can be overridden in the individual model files +# using the `{{ config(...) }}` macro. +models: + greenery: + # Config indicated by + and applies to all files under models/example/ + example: + +materialized: view + + post-hook: + on-run-end: + - "grant usage on schema {{ target.schema }} to role reporting" + + + - "grant select on all tables in schema {{ target.schema }} role reporting" + \ No newline at end of file diff --git a/greenery/macros/.gitkeep b/greenery/macros/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/greenery/macros/event_types_per_session.sql b/greenery/macros/event_types_per_session.sql new file mode 100644 index 000000000..150ffe361 --- /dev/null +++ b/greenery/macros/event_types_per_session.sql @@ -0,0 +1,31 @@ + + + + +{% macro get_column_values(column_name, relation) %} + +{% set relation_query %} +select distinct +{{ column_name }} +from {{ relation }} +order by 1 +{% endset %} + +{% set results = run_query(relation_query) %} + +{% if execute %} +{% set results_list = results.columns[0].values() %} +{% else %} +{% set results_list = [] %} +{% endif %} + +{{ return(results_list) }} + +{% endmacro %} + + +{% macro get_payment_methods() %} + +{{ return(get_column_values('event_type', ref('stg_greenery_events'))) }} + +{% endmacro %} diff --git a/greenery/models/example/expoosure_exampl.yml b/greenery/models/example/expoosure_exampl.yml new file mode 100644 index 000000000..449ae5bdb --- /dev/null +++ b/greenery/models/example/expoosure_exampl.yml @@ -0,0 +1,16 @@ +version: 2 + +exposures: + + - name: tableu_dash + type: dashboard + maturity: medium + url: https://tableau.io + description: > + all of the data + depends_on: + - ref('fct_funnel') + + owner: + name: sofi + email: sofi.svs.96@gmail.com diff --git a/greenery/models/example/marts/core/intermidiate/init_users_value.sql b/greenery/models/example/marts/core/intermidiate/init_users_value.sql new file mode 100644 index 000000000..8c7f8e3ff --- /dev/null +++ b/greenery/models/example/marts/core/intermidiate/init_users_value.sql @@ -0,0 +1,13 @@ +{{ + config( + materialized='table' + ) +}} + +select +stg_greenery_users.user_id, +order_cost + +from {{ref('stg_greenery_users')}} + left join {{ref('stg_greenery_orders')}} +on stg_greenery_users.user_id=stg_greenery_orders.user_id diff --git a/greenery/models/example/marts/core/ltv_users.sql b/greenery/models/example/marts/core/ltv_users.sql new file mode 100644 index 000000000..e31e83ab5 --- /dev/null +++ b/greenery/models/example/marts/core/ltv_users.sql @@ -0,0 +1,16 @@ + + +{{ + config( + materialized='table' + ) +}} + +select +user_id, +sum(order_cost) as orders_cost + +from {{ref('init_users_value')}} + GROUP BY 1 + + \ No newline at end of file diff --git a/greenery/models/example/marts/core/test.yml b/greenery/models/example/marts/core/test.yml new file mode 100644 index 000000000..128effe6a --- /dev/null +++ b/greenery/models/example/marts/core/test.yml @@ -0,0 +1,12 @@ +version: 2 + +models: + - name: stg_greenery_users + columns: + - name: name + tests: + - not_null + - unique + + + diff --git a/greenery/models/example/marts/marketing/discount.sql b/greenery/models/example/marts/marketing/discount.sql new file mode 100644 index 000000000..994d95582 --- /dev/null +++ b/greenery/models/example/marts/marketing/discount.sql @@ -0,0 +1,16 @@ +{{ + config( + MATERIALIZED='table' + ) +}} + + + + select + user_id, + sum(discount) acu_discount + + from {{ref('init_disccount_counts')}} +group by 1 + + diff --git a/greenery/models/example/marts/marketing/intermidiate/init_disccount_counts.sql b/greenery/models/example/marts/marketing/intermidiate/init_disccount_counts.sql new file mode 100644 index 000000000..a9aebed86 --- /dev/null +++ b/greenery/models/example/marts/marketing/intermidiate/init_disccount_counts.sql @@ -0,0 +1,16 @@ +{{ + config( + materialized='table' + ) +}} + +select +user_id, +order_id, +stg_greenery_orders.promo_id +,discount + +from {{ref('stg_greenery_orders')}} + left join {{ref('stg_greenery_promos')}} +on stg_greenery_promos.promo_id=stg_greenery_orders.promo_id + diff --git a/greenery/models/example/marts/product /event_type_per_sessions.sql b/greenery/models/example/marts/product /event_type_per_sessions.sql new file mode 100644 index 000000000..05770bdb0 --- /dev/null +++ b/greenery/models/example/marts/product /event_type_per_sessions.sql @@ -0,0 +1,15 @@ +{%- set event_types = get_column_values( + column_name='event_type', + relation=ref('stg_greenery_events'), + +) -%} + +select + session_id, + created_at, +{%- for event_type in event_types %} +sum(case when event_type = '{{event_type}}' then 1 end) as {{event_type}}_count +{%- if not loop.last %},{% endif -%} +{% endfor %} +from {{ ref('stg_greenery_events') }} +group by 1,2 diff --git a/greenery/models/example/marts/product /event_type_per_sessions_version2.sql b/greenery/models/example/marts/product /event_type_per_sessions_version2.sql new file mode 100644 index 000000000..e78c4bbe8 --- /dev/null +++ b/greenery/models/example/marts/product /event_type_per_sessions_version2.sql @@ -0,0 +1,13 @@ +{%- set event_types = dbt_utils.get_column_values( + table=ref('stg_greenery_events'), + column='event_type' +) -%} + +select +session_id, +{%- for event_type in event_types %} +sum(case when event_type = '{{event_type}}' then 1 end) as {{event_type}}_count +{%- if not loop.last %},{% endif -%} +{% endfor %} +from {{ ref('stg_greenery_events') }} +group by 1 diff --git a/greenery/models/example/marts/product /fct_funnel.sql b/greenery/models/example/marts/product /fct_funnel.sql new file mode 100644 index 000000000..5d6d2890c --- /dev/null +++ b/greenery/models/example/marts/product /fct_funnel.sql @@ -0,0 +1,19 @@ +{{ + config( + materialized = 'table' + ) +}} + + +with t1 as ( +SELECT +sum(CASE WHEN checkout_sum>0 THEN 1 END) as funnel3 +,sum(CASE WHEN checkout_sum>0 or add_to_cart_sum>0 THEN 1 END) as funnel2 +,sum(CASE WHEN checkout_sum>0 or add_to_cart_sum>0 or page_view_sum>0 THEN 1 END) as funnel1 + from dbt_sofia.init_funnel ) + + select *, + funnel1 - funnel2 as dif1_2, + funnel2 - funnel3 as dif2_3 +from t1 + diff --git a/greenery/models/example/marts/product /fct_sessions.sql b/greenery/models/example/marts/product /fct_sessions.sql new file mode 100644 index 000000000..e79edefd5 --- /dev/null +++ b/greenery/models/example/marts/product /fct_sessions.sql @@ -0,0 +1,36 @@ +{{ + config( + MATERIALIZED='table' + ) +}} + +with session_lenght as ( + + select + session_id + ,min(created_at ) as first_event + ,max(created_at) as last_event + from {{ref('stg_greenery_events')}} +group by 1 + + +) + +select +init_session_events_basic_agg.session_id +,init_session_events_basic_agg.user_id +,stg_greenery_users.first_name +,stg_greenery_users.last_name +,stg_greenery_users.email +,init_session_events_basic_agg.add_to_cart +,init_session_events_basic_agg.checkout +,init_session_events_basic_agg.package_shipped +,session_lenght.first_event as first_session_event +,session_lenght.last_event as last_session_event + + +from {{ref('init_session_events_basic_agg')}} +left join {{ref('stg_greenery_users')}} +on init_session_events_basic_agg.user_id="stg_greenery_users".user_id +left join session_lenght +on init_session_events_basic_agg.session_id=session_lenght.session_id diff --git a/greenery/models/example/marts/product /intermidiate/init_funnel.sql b/greenery/models/example/marts/product /intermidiate/init_funnel.sql new file mode 100644 index 000000000..1a26655b0 --- /dev/null +++ b/greenery/models/example/marts/product /intermidiate/init_funnel.sql @@ -0,0 +1,18 @@ +{{ + config( + materialized = 'table' + ) +}} + + + + +SELECT +session_id +,sum(DISTINCT(CASE WHEN checkout_count>0 THEN 1 END)) as checkout_sum +,sum(DISTINCT(CASE WHEN add_to_cart_count>0 THEN 1 END)) as add_to_cart_sum +,sum(DISTINCT(CASE WHEN page_view_count>0 THEN 1 END)) as page_view_sum +FROM dbt_sofia.event_type_per_sessions +GROUP BY session_id + + diff --git a/greenery/models/example/marts/product /intermidiate/init_session_events_basic_agg.sql b/greenery/models/example/marts/product /intermidiate/init_session_events_basic_agg.sql new file mode 100644 index 000000000..0bcef6334 --- /dev/null +++ b/greenery/models/example/marts/product /intermidiate/init_session_events_basic_agg.sql @@ -0,0 +1,18 @@ +{{ + config( + materialized='table' + ) +}} + +select +session_id +, created_at +,user_id +,sum(case when event_type='package_shipped' then 1 else 0 end) as package_shipped +,sum(case when event_type='page_view' then 1 else 0 end) as page_view +,sum(case when event_type='checkout' then 1 else 0 end) as checkout +,sum(case when event_type='add_to_cart' then 1 else 0 end) as add_to_cart +from {{ref('stg_greenery_events')}} +group by 1,2,3 + + diff --git a/greenery/models/example/my_first_dbt_model.sql b/greenery/models/example/my_first_dbt_model.sql new file mode 100644 index 000000000..01dc46a66 --- /dev/null +++ b/greenery/models/example/my_first_dbt_model.sql @@ -0,0 +1,27 @@ + +/* + Welcome to your first dbt model! + Did you know that you can also configure models directly within SQL files? + This will override configurations stated in dbt_project.yml + + Try changing "table" to "view" below +*/ + +{{ config(materialized='table') }} + +with source_data as ( + + select 1 as id + union all + select null as id + +) + +select * +from source_data + +/* + Uncomment the line below to remove records with null `id` values +*/ + + where id is not null diff --git a/greenery/models/example/my_second_dbt_model.sql b/greenery/models/example/my_second_dbt_model.sql new file mode 100644 index 000000000..c91f8793a --- /dev/null +++ b/greenery/models/example/my_second_dbt_model.sql @@ -0,0 +1,6 @@ + +-- Use the `ref` function to select from other models + +select * +from {{ ref('my_first_dbt_model') }} +where id = 1 diff --git a/greenery/models/example/schema.yml b/greenery/models/example/schema.yml new file mode 100644 index 000000000..2a5308171 --- /dev/null +++ b/greenery/models/example/schema.yml @@ -0,0 +1,21 @@ + +version: 2 + +models: + - name: my_first_dbt_model + description: "A starter dbt model" + columns: + - name: id + description: "The primary key for this table" + tests: + - unique + - not_null + + - name: my_second_dbt_model + description: "A starter dbt model" + columns: + - name: id + description: "The primary key for this table" + tests: + - unique + - not_null diff --git a/greenery/models/example/staging/greenery/Readme b/greenery/models/example/staging/greenery/Readme new file mode 100644 index 000000000..72af93018 --- /dev/null +++ b/greenery/models/example/staging/greenery/Readme @@ -0,0 +1,61 @@ +# Analytics engineering with dbt + +Q1 How many users do we have? + + select COUNT(DISTINCT user_id) as users from dbt.dbt_sofia.stg_greenery_users; +R:130 +=================================== +Q2 On average, how many orders do we receive per hour? + + with hours as (select + date_trunc('hour',created_at) as hour_order, + count(distinct order_id) as orders + from dbt.dbt_sofia.stg_greenery_orders + group by 1 ) + + select + sum(orders)/24 as odersperhour + from hours + R2:15.0416666666666667 + =================================== + Q3 On average, how long does an order take from being placed to being delivered? + + with delivertime as ( + select + order_id, + (date_trunc('day',delivered_at)-date_trunc('day',created_at)) as daystodeliver + from dbt.dbt_sofia.stg_greenery_orders) + + select + sum( daystodeliver)/count(distinct order_id) + from delivertime + + R3:3 days 06:54:50.858726 + =================================== + Q4 How many users have only made one purchase? Two purchases? Three+ purchases? + + with orderperuser as( + select + user_id,count(distinct order_id) as orders + from dbt.dbt_sofia.stg_greenery_orders + group by user_id + ) + select orders, count(distinct user_id) as users + from orderperuser + group by orders + R4: + image + =================================== + + Q5 On average, how many unique sessions do we have per hour? + + + select + count(distinct session_id)/ + date_part('hour',(date_trunc('hour',min(created_at))-date_trunc('hour',max(created_at)))) as avgsessionperhour + from dbt.dbt_sofia.stg_greenery_events + +R5:64.22222222222223 +## License + +Apache 2.0 diff --git a/greenery/models/example/staging/greenery/src_greenery.yml b/greenery/models/example/staging/greenery/src_greenery.yml new file mode 100644 index 000000000..f35585e6f --- /dev/null +++ b/greenery/models/example/staging/greenery/src_greenery.yml @@ -0,0 +1,31 @@ +version: 2 + +sources: + + - name: src_greenery # name of the source (this can be named whatever you want, but should be descriptive. this source (superheroes) is used for our week 1 tutorial so thats why i named it this way) + schema: public # this is the schema our raw data lives in + database: dbt # this is the name of our database + + quoting: + database: false + schema: false + identifier: false + + freshness: + warn_after: {count: 24, period: hour} + error_after: {count: 48, period: hour} + + tables: + - name: users + loaded_at_field: created_at + description: > + Contains demographic information about each superhero + - name: addresses + - name: orders + loaded_at_field: created_at + - name: promos + - name: order_items + - name: products + - name: events + loaded_at_field: created_at + diff --git a/greenery/models/example/staging/greenery/stg_greenery_addresses.sql b/greenery/models/example/staging/greenery/stg_greenery_addresses.sql new file mode 100644 index 000000000..ff972dfe4 --- /dev/null +++ b/greenery/models/example/staging/greenery/stg_greenery_addresses.sql @@ -0,0 +1,23 @@ +{{ + config( + materialized='view' + ) +}} + +with addresses_source as ( + select * from {{source('src_greenery','addresses')}} + +) + +, renamed_recast as ( + select + address_id + ,address + ,zipcode + ,state + ,country + from addresses_source +) + + +select * from renamed_recast \ No newline at end of file diff --git a/greenery/models/example/staging/greenery/stg_greenery_events.sql b/greenery/models/example/staging/greenery/stg_greenery_events.sql new file mode 100644 index 000000000..71105da1e --- /dev/null +++ b/greenery/models/example/staging/greenery/stg_greenery_events.sql @@ -0,0 +1,28 @@ +{{ + config( + materialized='view' + ) +}} + +with events_source as ( + select * from {{source('src_greenery','events')}} + +) + +, renamed_recast as ( + select + event_id, + session_id, + user_id, + event_type, + page_url, + created_at, + order_id, + product_id + + + from events_source +) + + +select * from renamed_recast \ No newline at end of file diff --git a/greenery/models/example/staging/greenery/stg_greenery_order_items.sql b/greenery/models/example/staging/greenery/stg_greenery_order_items.sql new file mode 100644 index 000000000..24b06a9af --- /dev/null +++ b/greenery/models/example/staging/greenery/stg_greenery_order_items.sql @@ -0,0 +1,23 @@ +{{ + config( + materialized='view' + ) +}} + +with order_items_source as ( + select * from {{source('src_greenery','order_items')}} + +) + +, renamed_recast as ( + select + order_id + ,product_id + ,quantity + + + from order_items_source +) + + +select * from renamed_recast \ No newline at end of file diff --git a/greenery/models/example/staging/greenery/stg_greenery_orders.sql b/greenery/models/example/staging/greenery/stg_greenery_orders.sql new file mode 100644 index 000000000..79c89f811 --- /dev/null +++ b/greenery/models/example/staging/greenery/stg_greenery_orders.sql @@ -0,0 +1,33 @@ +{{ + config( + materialized='view' + ) +}} + +with users_orders as ( + select * from {{source('src_greenery','orders')}} + +) + +, renamed_recast as ( + select + order_id + ,user_id + ,promo_id + ,address_id + ,created_at + ,order_cost + ,shipping_cost + ,order_total + ,tracking_id + ,shipping_service + ,estimated_delivery_at + ,delivered_at + ,status + + + from users_orders +) + + +select * from renamed_recast \ No newline at end of file diff --git a/greenery/models/example/staging/greenery/stg_greenery_products.sql b/greenery/models/example/staging/greenery/stg_greenery_products.sql new file mode 100644 index 000000000..7fa2f630c --- /dev/null +++ b/greenery/models/example/staging/greenery/stg_greenery_products.sql @@ -0,0 +1,23 @@ +{{ + config( + materialized='view' + ) +}} + +with products_source as ( + select * from {{source('src_greenery','products')}} + +) + +, renamed_recast as ( + select + product_id + ,name + ,price + ,inventory + + from products_source +) + + +select * from renamed_recast \ No newline at end of file diff --git a/greenery/models/example/staging/greenery/stg_greenery_promos.sql b/greenery/models/example/staging/greenery/stg_greenery_promos.sql new file mode 100644 index 000000000..b272c3023 --- /dev/null +++ b/greenery/models/example/staging/greenery/stg_greenery_promos.sql @@ -0,0 +1,22 @@ +{{ + config( + materialized='view' + ) +}} + +with promo_source as ( + select * from {{source('src_greenery','promos')}} + +) + +, renamed_recast as ( + select + promo_id + ,discount + ,status + from promo_source +) + + +select * from renamed_recast + diff --git a/greenery/models/example/staging/greenery/stg_greenery_users.sql b/greenery/models/example/staging/greenery/stg_greenery_users.sql new file mode 100644 index 000000000..92c8d7124 --- /dev/null +++ b/greenery/models/example/staging/greenery/stg_greenery_users.sql @@ -0,0 +1,27 @@ +{{ + config( + materialized='view' + ) +}} + +with users_source as ( + select * from {{source('src_greenery','users')}} + +) + +, renamed_recast as ( + select + user_id + + ,first_name + ,last_name + ,email + ,phone_number + ,created_at as created_at_utc + ,updated_at as update_at_utc + ,address_id as address_guid + from users_source +) + + +select * from renamed_recast \ No newline at end of file diff --git a/greenery/packages.yml b/greenery/packages.yml new file mode 100644 index 000000000..1718c48cc --- /dev/null +++ b/greenery/packages.yml @@ -0,0 +1,8 @@ + +packages: + - package: dbt-labs/dbt_utils + version: 0.8.0 + - package: calogica/dbt_expectations + version: 0.5.1 + - package: dbt-labs/codegen + version: 0.5.0 \ No newline at end of file diff --git a/greenery/seeds/.gitkeep b/greenery/seeds/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/greenery/snapshots/.gitkeep b/greenery/snapshots/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/greenery/snapshots/orders_snapshot.sql b/greenery/snapshots/orders_snapshot.sql new file mode 100644 index 000000000..fefbd3127 --- /dev/null +++ b/greenery/snapshots/orders_snapshot.sql @@ -0,0 +1,13 @@ +{% snapshot orders_snapshot%} +{{ + config( + target_schema='snapshots' + , strategy= 'check' + ,unique_key= 'order_id' + , check_cols=['status'] + ) +}} + +select * from {{ source ('src_greenery','orders')}} + +{% endsnapshot %} diff --git a/greenery/tests/.gitkeep b/greenery/tests/.gitkeep new file mode 100644 index 000000000..e69de29bb