SQL Crowdfunding platform

Dt User Campaigns Facts

Dt User Campaigns Facts model for crowdfunding platform.

source-preserved

Blocks

dt_user_campaigns_facts.sql · 33 lines
inferred
-- models/dt_user_campaigns_facts.sql
{{ config(materialized='view') }}

select
  a.id as user_id,
  case when b.name = 'PlatformApp iPhone' then 'iOS'
       when a.api_user_id = '1' then 'PlatformDomain.com'
       else 'API' end as user_type,
  a.is_partial,
  a.registrationdate,
  c.creationdate as campaign_ts,
  c.id as campaign_id,
  c.status,
  case when c.creationdate is not null then rank() over(partition by a.id order by c.creationdate) end as rank
from users a
join api_users b
on a.api_user_id = b.id
left outer join campaigns c
on a.id = c.user_id and a.registrationdate < c.creationdate

# models/schema.yml
version: 2

models:
  - name: dt_user_campaigns_facts
    columns:
      - name: user_id
      - name: is_partial
      - name: user_type
      - name: rank
      - name: campaign_id
      - name: status
      - name: days_since_first_creation

Assumptions

  • 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.
dt_user_campaigns_facts.sql · 16 lines
source-preserved validation: parses
select
  a.id as user_id,
  case when b.name = 'PlatformApp iPhone' then 'iOS'
       when a.api_user_id = '1' then 'PlatformDomain.com'
       else 'API' end as user_type,
  a.is_partial,
  a.registrationdate,
  c.creationdate as campaign_ts,
  c.id as campaign_id,
  c.status,
  case when c.creationdate is not null then rank() over(partition by a.id order by c.creationdate) end as rank
from users a
join api_users b
on a.api_user_id = b.id
left outer join campaigns c
on a.id = c.user_id and a.registrationdate < c.creationdate
dt_user_campaigns_facts.view.lkml · 76 lines
inferred
view: dt_user_campaigns_facts {
  derived_table: {
    sql: select
  a.id as user_id,
  case when b.name = 'PlatformApp iPhone' then 'iOS'
       when a.api_user_id = '1' then 'PlatformDomain.com'
       else 'API' end as user_type,
  a.is_partial,
  a.registrationdate,
  c.creationdate as campaign_ts,
  c.id as campaign_id,
  c.status,
  case when c.creationdate is not null then rank() over(partition by a.id order by c.creationdate) end as rank
from users a
join api_users b
on a.api_user_id = b.id
left outer join campaigns c
on a.id = c.user_id and a.registrationdate < c.creationdate ;;
  }

  dimension: user_id {
  }

  dimension: is_partial {
  }

  dimension: user_type {
  }

  dimension: rank {
  }

  dimension: campaign_id {
  }

  dimension: status {
  }

  dimension: days_since_first_creation {
    type: int
    sql: coalesce(campaign_ts::date - registrationdate::date, -1) ;;
  }

  dimension_group: registration {
    type: time
    timeframes: [date, week, month]
    sql: ${TABLE}.registrationdate ;;
  }

  dimension_group: campaign_creation {
    type: time
    timeframes: [date, week, month]
    sql: ${TABLE}.campaign_ts ;;
  }

  measure: count_users {
    type: count
    sql: ${TABLE}.user_id ;;
  }

  measure: first_time_admins {
    type: count_distinct
    filters: [rank: "1"]
    sql: ${TABLE}.user_id ;;
  }

  measure: percent_creators {
    type: number
    sql: 100.0 * ${first_time_admins}/${count_users} ;;
  }

  measure: percent_creators_with_contribution {
    type: number
    sql: 100.0 * ${dt_valid_contributions.count_admins}/${count_users} ;;
  }
}
dt_user_campaigns_facts.view.lookml · 56 lines
source-preserved
- view: dt_user_campaigns_facts
  derived_table:
    sql: select
  a.id as user_id,
  case when b.name = 'PlatformApp iPhone' then 'iOS'
       when a.api_user_id = '1' then 'PlatformDomain.com'
       else 'API' end as user_type,
  a.is_partial,
  a.registrationdate,
  c.creationdate as campaign_ts,
  c.id as campaign_id,
  c.status,
  case when c.creationdate is not null then rank() over(partition by a.id order by c.creationdate) end as rank
from users a
join api_users b
on a.api_user_id = b.id
left outer join campaigns c
on a.id = c.user_id and a.registrationdate < c.creationdate
  fields:
  - dimension: user_id
  - dimension: is_partial
  - dimension: user_type
  - dimension: rank
  - dimension: campaign_id
  - dimension: status
  - dimension: days_since_first_creation
    type: int
    sql: coalesce(campaign_ts::date - registrationdate::date, -1)
  - dimension_group: registration
    type: time
    timeframes:
    - date
    - week
    - month
    sql: ${TABLE}.registrationdate
  - dimension_group: campaign_creation
    type: time
    timeframes:
    - date
    - week
    - month
    sql: ${TABLE}.campaign_ts
  - measure: count_users
    type: count
    sql: ${TABLE}.user_id
  - measure: first_time_admins
    type: count_distinct
    filters:
    - rank: 1
    sql: ${TABLE}.user_id
  - measure: percent_creators
    type: number
    sql: 100.0 * ${first_time_admins}/${count_users}
  - measure: percent_creators_with_contribution
    type: number
    sql: 100.0 * ${dt_valid_contributions.count_admins}/${count_users}

Contents

  • dt_user_campaigns_facts.sql
  • dt_user_campaigns_facts.sql
  • dt_user_campaigns_facts.view.lkml
  • dt_user_campaigns_facts.view.lookml