SQL Health marketing

Campaign Affinity

Campaign Affinity model for health marketing.

source-preserved

Blocks

campaign_affinity.sql · 44 lines
inferred
-- models/campaign_affinity.sql
{{ config(materialized='table') }}

SELECT
campaign_a ,
campaign_b ,
prop.gender,
prop.age_group,
joint_frequency ,
top1.campaign_frequency AS campaign_a_frequency ,
top2.campaign_frequency AS campaign_b_frequency
FROM
(
  SELECT
      op1.mts_program_id AS campaign_a_id,
      op1.name AS campaign_a ,
      op1.gender AS gender,
      op1.age_group as age_group,
      op2.mts_program_id AS campaign_b_id,
      op2.name AS campaign_b ,
      COUNT(*) AS joint_frequency
  FROM
      {{ ref('session_campaigns') }} AS op1
  INNER JOIN {{ ref('session_campaigns') }} AS op2
  ON  op1.session_id = op2.session_id
  GROUP BY
      1,2,3,4,5,6
) AS prop
INNER JOIN {{ ref('campaign_session_frequency') }} AS top1 ON prop.campaign_a_id = top1.mts_program_id and prop.gender = top1.gender and prop.age_group = top1.age_group
INNER JOIN {{ ref('campaign_session_frequency') }} AS top2 ON prop.campaign_b_id = top2.mts_program_id and prop.gender = top2.gender and prop.age_group = top2.age_group
WHERE campaign_a <> campaign_b
ORDER BY
3 DESC

# models/schema.yml
version: 2

models:
  - name: campaign_affinity
    columns:
      - name: campaign_a
      - name: campaign_b
      - name: gender
      - name: age_group

Assumptions

  • Each ${view.SQL_TABLE_NAME} was mapped to {{ ref('view') }}; confirm a dbt model exists for each referenced view.
  • materialized='table' inferred from a LookML persist hint (persist_for / datagroup / sql_trigger_value).
  • schema.yml columns come from view dimensions; a primary_key dimension gets unique + not_null tests.
campaign_affinity.sql · 30 lines
source-preserved validation: not checked
SELECT
campaign_a ,
campaign_b ,
prop.gender,
prop.age_group,
joint_frequency ,
top1.campaign_frequency AS campaign_a_frequency ,
top2.campaign_frequency AS campaign_b_frequency
FROM
(
  SELECT
      op1.mts_program_id AS campaign_a_id,
      op1.name AS campaign_a ,
      op1.gender AS gender,
      op1.age_group as age_group,
      op2.mts_program_id AS campaign_b_id,
      op2.name AS campaign_b ,
      COUNT(*) AS joint_frequency
  FROM
      ${session_campaigns.SQL_TABLE_NAME} AS op1
  INNER JOIN ${session_campaigns.SQL_TABLE_NAME} AS op2
  ON  op1.session_id = op2.session_id
  GROUP BY
      1,2,3,4,5,6
) AS prop
INNER JOIN ${campaign_session_frequency.SQL_TABLE_NAME} AS top1 ON prop.campaign_a_id = top1.mts_program_id and prop.gender = top1.gender and prop.age_group = top1.age_group
INNER JOIN ${campaign_session_frequency.SQL_TABLE_NAME} AS top2 ON prop.campaign_b_id = top2.mts_program_id and prop.gender = top2.gender and prop.age_group = top2.age_group
WHERE campaign_a <> campaign_b
ORDER BY
3 DESC
campaign_affinity.view.lkml · 71 lines
inferred
view: campaign_affinity {
  derived_table: {
    sql: SELECT
campaign_a ,
campaign_b ,
prop.gender,
prop.age_group,
joint_frequency ,
top1.campaign_frequency AS campaign_a_frequency ,
top2.campaign_frequency AS campaign_b_frequency
FROM
(
  SELECT
      op1.mts_program_id AS campaign_a_id,
      op1.name AS campaign_a ,
      op1.gender AS gender,
      op1.age_group as age_group,
      op2.mts_program_id AS campaign_b_id,
      op2.name AS campaign_b ,
      COUNT(*) AS joint_frequency
  FROM
      ${session_campaigns.SQL_TABLE_NAME} AS op1
  INNER JOIN ${session_campaigns.SQL_TABLE_NAME} AS op2
  ON  op1.session_id = op2.session_id
  GROUP BY
      1,2,3,4,5,6
) AS prop
INNER JOIN ${campaign_session_frequency.SQL_TABLE_NAME} AS top1 ON prop.campaign_a_id = top1.mts_program_id and prop.gender = top1.gender and prop.age_group = top1.age_group
INNER JOIN ${campaign_session_frequency.SQL_TABLE_NAME} AS top2 ON prop.campaign_b_id = top2.mts_program_id and prop.gender = top2.gender and prop.age_group = top2.age_group
WHERE campaign_a <> campaign_b
ORDER BY
3 DESC ;;
    persist_for: "24 hours"
  }

  dimension: campaign_a {
    sql: ${TABLE}.campaign_a ;;
  }

  dimension: campaign_b {
    sql: ${TABLE}.campaign_b ;;
  }

  dimension: gender {
    sql: ${TABLE}.gender ;;
  }

  dimension: age_group {
    sql: ${TABLE}.age_group ;;
  }

  measure: joint_frequency {
    type: sum
    sql: ${TABLE}.joint_frequency ;;
  }

  measure: campaign_a_frequency {
    type: sum
    sql: ${TABLE}.campaign_a_frequency ;;
  }

  measure: campaign_b_frequency {
    type: sum
    sql: ${TABLE}.campaign_b_frequency ;;
  }

  measure: affinity {
    type: number
    sql: 100 * (${joint_frequency}/(${campaign_a_frequency} + ${campaign_b_frequency} - ${joint_frequency})) ;;
  }
}
campaign_affinity.view.lookml · 54 lines
source-preserved
- view: campaign_affinity
  derived_table:
    sql: SELECT
campaign_a ,
campaign_b ,
prop.gender,
prop.age_group,
joint_frequency ,
top1.campaign_frequency AS campaign_a_frequency ,
top2.campaign_frequency AS campaign_b_frequency
FROM
(
  SELECT
      op1.mts_program_id AS campaign_a_id,
      op1.name AS campaign_a ,
      op1.gender AS gender,
      op1.age_group as age_group,
      op2.mts_program_id AS campaign_b_id,
      op2.name AS campaign_b ,
      COUNT(*) AS joint_frequency
  FROM
      ${session_campaigns.SQL_TABLE_NAME} AS op1
  INNER JOIN ${session_campaigns.SQL_TABLE_NAME} AS op2
  ON  op1.session_id = op2.session_id
  GROUP BY
      1,2,3,4,5,6
) AS prop
INNER JOIN ${campaign_session_frequency.SQL_TABLE_NAME} AS top1 ON prop.campaign_a_id = top1.mts_program_id and prop.gender = top1.gender and prop.age_group = top1.age_group
INNER JOIN ${campaign_session_frequency.SQL_TABLE_NAME} AS top2 ON prop.campaign_b_id = top2.mts_program_id and prop.gender = top2.gender and prop.age_group = top2.age_group
WHERE campaign_a <> campaign_b
ORDER BY
3 DESC
    persist_for: 24 hours
  fields:
  - dimension: campaign_a
    sql: ${TABLE}.campaign_a
  - dimension: campaign_b
    sql: ${TABLE}.campaign_b
  - dimension: gender
    sql: ${TABLE}.gender
  - dimension: age_group
    sql: ${TABLE}.age_group
  - measure: joint_frequency
    type: sum
    sql: ${TABLE}.joint_frequency
  - measure: campaign_a_frequency
    type: sum
    sql: ${TABLE}.campaign_a_frequency
  - measure: campaign_b_frequency
    type: sum
    sql: ${TABLE}.campaign_b_frequency
  - measure: affinity
    type: number
    sql: 100 * (${joint_frequency}/(${campaign_a_frequency} + ${campaign_b_frequency} - ${joint_frequency}))

Contents

  • campaign_affinity.sql
  • campaign_affinity.sql
  • campaign_affinity.view.lkml
  • campaign_affinity.view.lookml