SQL
Crowdfunding education
Referral
Referral model for crowdfunding education.
source-preserved
Blocks
referral.sql · 57 lines
inferred
-- models/referral.sql
{{ config(materialized='view') }}
SELECT
paymentid
, rfparam
, (CASE WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%' THEN split_part(rfparam, '-', 1) ELSE NULL END) as medium
, (CASE WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%' THEN split_part(rfparam, '-', 2) ELSE NULL END) as source
, (CASE
WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%' -- SIMILAR TO '%~_[0-9]{4}~_[0-9]{2}%' ESCAPE '~'
THEN
(CASE WHEN SUBSTRING(rfparam FROM STRPOS(rfparam, '-20')+1 FOR 7) ~ '[0-9]{4}-[0-9]{2}'
THEN to_timestamp(SUBSTRING(rfparam FROM STRPOS(rfparam, '-20')+1 FOR 7), 'YYYY-MM')
ELSE NULL END)
ELSE NULL END) as campaign_date
, created
, (CASE
WHEN rfparam like '%mmi%' THEN trim(substring(rfparam from '&?-mmi_?([^$]+)+?(?=)' ))
WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%teacherid_[0-9]+%' THEN 'teacherid_x'
ELSE split_part(rfparam, '-', 5) END) AS campaign
, (CASE WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%teacherid_[0-9]+%' THEN 'teacher'
ELSE split_part(rfparam, '-', 6) END) as user_type
, landingurl
FROM ReferredSiteVisit visit
JOIN
(SELECT paymentid, MAX(id) as visit_id
FROM {{ ref('payment') }} pay
INNER JOIN ReferredSiteVisit visit ON pay.donorid = visit.userid
WHERE 1=1
--Hiding this for a short while, just to troubleshoot some queries. It makes for a longer table in the meantime.
--WHERE visit.rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%'
AND (visit.rfparam IS NOT NULL AND LENGTH(visit.rfparam) > 0)
AND pay.received = {% parameter y_value_placeholder %}
AND pay.received_date BETWEEN visit.created AND visit.created + '5 days'
GROUP BY 1
) one_to_one ON one_to_one.visit_id = visit.id
-- Must groupby, to remove duplicated resulting from visit table entries
GROUP BY 1,2,3,4,5,6,7,9
# models/schema.yml
version: 2
models:
- name: referral
columns:
- name: paymentid
tests:
- unique
- not_null
- name: rfparam
- name: medium
- name: source
- name: campaign
- name: user_type
- name: landing_url
- name: mmi
Assumptions
- Each ${view.SQL_TABLE_NAME} was mapped to {{ ref('view') }}; confirm a dbt model exists for each referenced view.
- materialized='view' is the default; no persist hint found.
- schema.yml columns come from view dimensions; a primary_key dimension gets unique + not_null tests.
referral.sql · 36 lines
source-preserved
validation: not checked
SELECT
paymentid
, rfparam
, (CASE WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%' THEN split_part(rfparam, '-', 1) ELSE NULL END) as medium
, (CASE WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%' THEN split_part(rfparam, '-', 2) ELSE NULL END) as source
, (CASE
WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%' -- SIMILAR TO '%~_[0-9]{4}~_[0-9]{2}%' ESCAPE '~'
THEN
(CASE WHEN SUBSTRING(rfparam FROM STRPOS(rfparam, '-20')+1 FOR 7) ~ '[0-9]{4}-[0-9]{2}'
THEN to_timestamp(SUBSTRING(rfparam FROM STRPOS(rfparam, '-20')+1 FOR 7), 'YYYY-MM')
ELSE NULL END)
ELSE NULL END) as campaign_date
, created
, (CASE
WHEN rfparam like '%mmi%' THEN trim(substring(rfparam from '&?-mmi_?([^$]+)+?(?=)' ))
WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%teacherid_[0-9]+%' THEN 'teacherid_x'
ELSE split_part(rfparam, '-', 5) END) AS campaign
, (CASE WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%teacherid_[0-9]+%' THEN 'teacher'
ELSE split_part(rfparam, '-', 6) END) as user_type
, landingurl
FROM ReferredSiteVisit visit
JOIN
(SELECT paymentid, MAX(id) as visit_id
FROM ${payment.SQL_TABLE_NAME} pay
INNER JOIN ReferredSiteVisit visit ON pay.donorid = visit.userid
WHERE 1=1
--Hiding this for a short while, just to troubleshoot some queries. It makes for a longer table in the meantime.
--WHERE visit.rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%'
AND (visit.rfparam IS NOT NULL AND LENGTH(visit.rfparam) > 0)
AND pay.received = {% parameter y_value_placeholder %}
AND pay.received_date BETWEEN visit.created AND visit.created + '5 days'
GROUP BY 1
) one_to_one ON one_to_one.visit_id = visit.id
-- Must groupby, to remove duplicated resulting from visit table entries
GROUP BY 1,2,3,4,5,6,7,9
referral.view.lkml · 90 lines
inferred
view: referral {
derived_table: {
sql: SELECT
paymentid
, rfparam
, (CASE WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%' THEN split_part(rfparam, '-', 1) ELSE NULL END) as medium
, (CASE WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%' THEN split_part(rfparam, '-', 2) ELSE NULL END) as source
, (CASE
WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%' -- SIMILAR TO '%~_[0-9]{4}~_[0-9]{2}%' ESCAPE '~'
THEN
(CASE WHEN SUBSTRING(rfparam FROM STRPOS(rfparam, '-20')+1 FOR 7) ~ '[0-9]{4}-[0-9]{2}'
THEN to_timestamp(SUBSTRING(rfparam FROM STRPOS(rfparam, '-20')+1 FOR 7), 'YYYY-MM')
ELSE NULL END)
ELSE NULL END) as campaign_date
, created
, (CASE
WHEN rfparam like '%mmi%' THEN trim(substring(rfparam from '&?-mmi_?([^$]+)+?(?=)' ))
WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%teacherid_[0-9]+%' THEN 'teacherid_x'
ELSE split_part(rfparam, '-', 5) END) AS campaign
, (CASE WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%teacherid_[0-9]+%' THEN 'teacher'
ELSE split_part(rfparam, '-', 6) END) as user_type
, landingurl
FROM ReferredSiteVisit visit
JOIN
(SELECT paymentid, MAX(id) as visit_id
FROM ${payment.SQL_TABLE_NAME} pay
INNER JOIN ReferredSiteVisit visit ON pay.donorid = visit.userid
WHERE 1=1
--Hiding this for a short while, just to troubleshoot some queries. It makes for a longer table in the meantime.
--WHERE visit.rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%'
AND (visit.rfparam IS NOT NULL AND LENGTH(visit.rfparam) > 0)
AND pay.received = {% parameter y_value_placeholder %}
AND pay.received_date BETWEEN visit.created AND visit.created + '5 days'
GROUP BY 1
) one_to_one ON one_to_one.visit_id = visit.id
-- Must groupby, to remove duplicated resulting from visit table entries
GROUP BY 1,2,3,4,5,6,7,9 ;;
}
dimension: paymentid {
label: "Payment ID"
type: int
primary_key: yes
hidden: yes
sql: ${TABLE}.paymentid ;;
}
dimension: rfparam {
sql: lower(${TABLE}.rfparam) ;;
}
dimension: medium {
sql: lower(${TABLE}.medium) ;;
}
dimension: source {
sql: lower(${TABLE}.source) ;;
}
dimension: campaign {
sql: lower(${TABLE}.campaign) ;;
}
dimension: user_type {
sql: lower(${TABLE}.user_type) ;;
}
dimension: landing_url {
sql: lower(${TABLE}.landingurl) ;;
}
dimension: mmi {
label: "REFERRAL MMI (Yes / No)"
type: yesno
sql: CASE WHEN ${TABLE}.rfparam like '%mmi%' THEN TRUE ELSE FALSE END ;;
}
dimension_group: campaign {
type: time
timeframes: [month]
sql: ${TABLE}.campaign_date ;;
}
dimension_group: created {
type: time
timeframes: [date]
sql: ${TABLE}.created ;;
}
}
referral.view.lookml · 71 lines
source-preserved
- view: referral
derived_table:
sql: SELECT
paymentid
, rfparam
, (CASE WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%' THEN split_part(rfparam, '-', 1) ELSE NULL END) as medium
, (CASE WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%' THEN split_part(rfparam, '-', 2) ELSE NULL END) as source
, (CASE
WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%' -- SIMILAR TO '%~_[0-9]{4}~_[0-9]{2}%' ESCAPE '~'
THEN
(CASE WHEN SUBSTRING(rfparam FROM STRPOS(rfparam, '-20')+1 FOR 7) ~ '[0-9]{4}-[0-9]{2}'
THEN to_timestamp(SUBSTRING(rfparam FROM STRPOS(rfparam, '-20')+1 FOR 7), 'YYYY-MM')
ELSE NULL END)
ELSE NULL END) as campaign_date
, created
, (CASE
WHEN rfparam like '%mmi%' THEN trim(substring(rfparam from '&?-mmi_?([^$]+)+?(?=)' ))
WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%teacherid_[0-9]+%' THEN 'teacherid_x'
ELSE split_part(rfparam, '-', 5) END) AS campaign
, (CASE WHEN rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%teacherid_[0-9]+%' THEN 'teacher'
ELSE split_part(rfparam, '-', 6) END) as user_type
, landingurl
FROM ReferredSiteVisit visit
JOIN
(SELECT paymentid, MAX(id) as visit_id
FROM ${payment.SQL_TABLE_NAME} pay
INNER JOIN ReferredSiteVisit visit ON pay.donorid = visit.userid
WHERE 1=1
--Hiding this for a short while, just to troubleshoot some queries. It makes for a longer table in the meantime.
--WHERE visit.rfparam SIMILAR TO '%-[0-9]{4}-[0-9]{2}%'
AND (visit.rfparam IS NOT NULL AND LENGTH(visit.rfparam) > 0)
AND pay.received = {% parameter y_value_placeholder %}
AND pay.received_date BETWEEN visit.created AND visit.created + '5 days'
GROUP BY 1
) one_to_one ON one_to_one.visit_id = visit.id
-- Must groupby, to remove duplicated resulting from visit table entries
GROUP BY 1,2,3,4,5,6,7,9
fields:
- dimension: paymentid
type: int
primary_key: true
hidden: true
label: Payment ID
sql: ${TABLE}.paymentid
- dimension: rfparam
sql: lower(${TABLE}.rfparam)
- dimension: medium
sql: lower(${TABLE}.medium)
- dimension: source
sql: lower(${TABLE}.source)
- dimension: campaign
sql: lower(${TABLE}.campaign)
- dimension: user_type
sql: lower(${TABLE}.user_type)
- dimension: landing_url
sql: lower(${TABLE}.landingurl)
- dimension: mmi
type: yesno
label: REFERRAL MMI (Yes / No)
sql: CASE WHEN ${TABLE}.rfparam like '%mmi%' THEN TRUE ELSE FALSE END
- dimension_group: campaign
type: time
timeframes:
- month
sql: ${TABLE}.campaign_date
- dimension_group: created
type: time
timeframes:
- date
sql: ${TABLE}.created
Contents
- referral.sql
- referral.sql
- referral.view.lkml
- referral.view.lookml