dbt Streaming cinema

Rolling Premium Users

Rolling Premium Users model for streaming cinema.

inferred

Blocks

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

SELECT
  daily_use_premium.user_id
  ,daily_use_premium.user_type
  ,daily_use_premium.platform
  ,daily_use_premium.country
  ,daily_use_premium.plan_name
  ,daily_use_premium.merchant_type
  ,daily_use_premium.view_date
  ,daily_use_premium.seconds_watched
  ,dates.date as observation_date
FROM
{{ ref('daily_use_premium') }} AS daily_use_premium
LEFT JOIN  {{ ref('dates') }} AS dates
  ON dates.date  >= daily_use_premium.view_date
  AND dates.date < daily_use_premium.view_date + interval '30 day'
WHERE
 {% condition view_date %} daily_use_premium.view_date {% endcondition %}
 AND
 {% condition observation_date %} dates.date {% endcondition %}

# models/schema.yml
version: 2

models:
  - name: rolling_premium_users
    columns:
      - name: country
      - name: merchant_type
      - name: minutes_watched
      - name: plan_name
      - name: platform
      - name: seconds_watched
      - name: user_id
      - name: user_type
      - name: view
      - name: watched_within_1_days
      - name: watched_within_2_days
      - name: watched_within_3_days
      - name: watched_within_4_days
      - name: watched_within_7_days
      - name: watched_within_10_days
      - name: watched_within_14_days
      - name: watched_within_21_days
      - name: watched_within_30_days

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.
rolling_premium_users.sql · 19 lines
source-preserved validation: not checked
SELECT
  daily_use_premium.user_id
  ,daily_use_premium.user_type
  ,daily_use_premium.platform
  ,daily_use_premium.country
  ,daily_use_premium.plan_name
  ,daily_use_premium.merchant_type
  ,daily_use_premium.view_date
  ,daily_use_premium.seconds_watched
  ,dates.date as observation_date
FROM
${daily_use_premium.SQL_TABLE_NAME} AS daily_use_premium
LEFT JOIN  ${dates.SQL_TABLE_NAME} AS dates
  ON dates.date  >= daily_use_premium.view_date
  AND dates.date < daily_use_premium.view_date + interval '30 day'
WHERE
 {% condition view_date %} daily_use_premium.view_date {% endcondition %}
 AND
 {% condition observation_date %} dates.date {% endcondition %}
rolling_premium_users.view.lkml · 197 lines
inferred
view: rolling_premium_users {
  derived_table: {
    sql: SELECT
  daily_use_premium.user_id
  ,daily_use_premium.user_type
  ,daily_use_premium.platform
  ,daily_use_premium.country
  ,daily_use_premium.plan_name
  ,daily_use_premium.merchant_type
  ,daily_use_premium.view_date
  ,daily_use_premium.seconds_watched
  ,dates.date as observation_date
FROM
${daily_use_premium.SQL_TABLE_NAME} AS daily_use_premium
LEFT JOIN  ${dates.SQL_TABLE_NAME} AS dates
  ON dates.date  >= daily_use_premium.view_date
  AND dates.date < daily_use_premium.view_date + interval '30 day'
WHERE
 {% condition view_date %} daily_use_premium.view_date {% endcondition %}
 AND
 {% condition observation_date %} dates.date {% endcondition %} ;;
  }

  dimension: country {
    type: string
    sql: ${TABLE}.country ;;
  }

  dimension: merchant_type {
    type: string
    sql: ${TABLE}.merchant_type ;;
  }

  dimension: minutes_watched {
    type: number
    hidden: yes
    sql: ${TABLE}.seconds_watched/60.0 ;;
  }

  dimension: plan_name {
    type: string
    sql: ${TABLE}.plan_name ;;
  }

  dimension: platform {
    type: string
    sql: ${TABLE}.platform ;;
  }

  dimension: seconds_watched {
    type: int
    sql: ${TABLE}.seconds_watched ;;
  }

  dimension: user_id {
    type: int
    sql: ${TABLE}.user_id ;;
  }

  dimension: user_type {
    type: string
    sql: ${TABLE}.user_type ;;
  }

  dimension: view {
    type: time
    sql: ${TABLE}.view_date ;;
  }

  dimension: watched_within_1_days {
    type: yesno
    sql: ${view_raw} + interval '1 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw} ;;
  }

  dimension: watched_within_2_days {
    type: yesno
    sql: ${view_raw} + interval '2 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw} ;;
  }

  dimension: watched_within_3_days {
    type: yesno
    sql: ${view_raw} + interval '3 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw} ;;
  }

  dimension: watched_within_4_days {
    type: yesno
    sql: ${view_raw} + interval '4 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw} ;;
  }

  dimension: watched_within_7_days {
    type: yesno
    sql: ${view_raw} + interval '7 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw} ;;
  }

  dimension: watched_within_10_days {
    type: yesno
    sql: ${view_raw} + interval '10 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw} ;;
  }

  dimension: watched_within_14_days {
    type: yesno
    sql: ${view_raw} + interval '14 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw} ;;
  }

  dimension: watched_within_21_days {
    type: yesno
    sql: ${view_raw} + interval '21 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw} ;;
  }

  dimension: watched_within_30_days {
    type: yesno
    sql: ${view_raw} + interval '30 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw} ;;
  }

  dimension_group: observation {
    type: time
    timeframes: [time, date, week, month, raw]
    sql: ${TABLE}.observation_date ;;
  }

  measure: total_minutes_watched {
    type: sum
    sql: ${minutes_watched} ;;
  }

  measure: total_minutes_watched_1_day {
    type: sum
    filters: [watched_within_1_days: "Yes"]
    sql: ${minutes_watched} ;;
  }

  measure: total_minutes_watched_7_days {
    type: sum
    filters: [watched_within_7_days: "Yes"]
    sql: ${minutes_watched} ;;
  }

  measure: total_minutes_watched_30_days {
    type: sum
    filters: [watched_within_30_days: "Yes"]
    sql: ${minutes_watched} ;;
  }

  measure: rolling_premium_users_1d {
    type: count_distinct
    filters: [watched_within_1_days: "Yes"]
    sql: ${user_id} ;;
  }

  measure: rolling_premium_users_2d {
    type: count_distinct
    filters: [watched_within_2_days: "Yes"]
    sql: ${user_id} ;;
  }

  measure: rolling_premium_users_3d {
    type: count_distinct
    filters: [watched_within_3_days: "Yes"]
    sql: ${user_id} ;;
  }

  measure: rolling_premium_users_4d {
    type: count_distinct
    filters: [watched_within_4_days: "Yes"]
    sql: ${user_id} ;;
  }

  measure: rolling_premium_users_7d {
    type: count_distinct
    filters: [watched_within_7_days: "Yes"]
    sql: ${user_id} ;;
  }

  measure: rolling_premium_users_10d {
    type: count_distinct
    filters: [watched_within_10_days: "Yes"]
    sql: ${user_id} ;;
  }

  measure: rolling_premium_users_14d {
    type: count_distinct
    filters: [watched_within_14_days: "Yes"]
    sql: ${user_id} ;;
  }

  measure: rolling_premium_users_21d {
    type: count_distinct
    filters: [watched_within_21_days: "Yes"]
    sql: ${user_id} ;;
  }

  measure: rolling_premium_users_30d {
    type: count_distinct
    filters: [watched_within_30_days: "Yes"]
    sql: ${user_id} ;;
  }
}
rolling_premium_users.view.lookml · 149 lines
source-preserved
- view: rolling_premium_users
  derived_table:
    sql: SELECT
  daily_use_premium.user_id
  ,daily_use_premium.user_type
  ,daily_use_premium.platform
  ,daily_use_premium.country
  ,daily_use_premium.plan_name
  ,daily_use_premium.merchant_type
  ,daily_use_premium.view_date
  ,daily_use_premium.seconds_watched
  ,dates.date as observation_date
FROM
${daily_use_premium.SQL_TABLE_NAME} AS daily_use_premium
LEFT JOIN  ${dates.SQL_TABLE_NAME} AS dates
  ON dates.date  >= daily_use_premium.view_date
  AND dates.date < daily_use_premium.view_date + interval '30 day'
WHERE
 {% condition view_date %} daily_use_premium.view_date {% endcondition %}
 AND
 {% condition observation_date %} dates.date {% endcondition %}
  fields:
  - dimension: country
    type: string
    sql: ${TABLE}.country
  - dimension: merchant_type
    type: string
    sql: ${TABLE}.merchant_type
  - dimension: minutes_watched
    type: number
    hidden: true
    sql: ${TABLE}.seconds_watched/60.0
  - dimension: plan_name
    type: string
    sql: ${TABLE}.plan_name
  - dimension: platform
    type: string
    sql: ${TABLE}.platform
  - dimension: seconds_watched
    type: int
    sql: ${TABLE}.seconds_watched
  - dimension: user_id
    type: int
    sql: ${TABLE}.user_id
  - dimension: user_type
    type: string
    sql: ${TABLE}.user_type
  - dimension: view
    type: time
    sql: ${TABLE}.view_date
  - dimension: watched_within_1_days
    type: yesno
    sql: ${view_raw} + interval '1 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw}
  - dimension: watched_within_2_days
    type: yesno
    sql: ${view_raw} + interval '2 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw}
  - dimension: watched_within_3_days
    type: yesno
    sql: ${view_raw} + interval '3 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw}
  - dimension: watched_within_4_days
    type: yesno
    sql: ${view_raw} + interval '4 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw}
  - dimension: watched_within_7_days
    type: yesno
    sql: ${view_raw} + interval '7 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw}
  - dimension: watched_within_10_days
    type: yesno
    sql: ${view_raw} + interval '10 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw}
  - dimension: watched_within_14_days
    type: yesno
    sql: ${view_raw} + interval '14 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw}
  - dimension: watched_within_21_days
    type: yesno
    sql: ${view_raw} + interval '21 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw}
  - dimension: watched_within_30_days
    type: yesno
    sql: ${view_raw} + interval '30 day' > ${observation_raw} AND  ${view_raw} <= ${observation_raw}
  - dimension_group: observation
    type: time
    timeframes:
    - time
    - date
    - week
    - month
    - raw
    sql: ${TABLE}.observation_date
  - measure: total_minutes_watched
    type: sum
    sql: ${minutes_watched}
  - measure: total_minutes_watched_1_day
    type: sum
    filters:
    - watched_within_1_days: Yes
    sql: ${minutes_watched}
  - measure: total_minutes_watched_7_days
    type: sum
    filters:
    - watched_within_7_days: Yes
    sql: ${minutes_watched}
  - measure: total_minutes_watched_30_days
    type: sum
    filters:
    - watched_within_30_days: Yes
    sql: ${minutes_watched}
  - measure: rolling_premium_users_1d
    type: count_distinct
    filters:
    - watched_within_1_days: Yes
    sql: ${user_id}
  - measure: rolling_premium_users_2d
    type: count_distinct
    filters:
    - watched_within_2_days: Yes
    sql: ${user_id}
  - measure: rolling_premium_users_3d
    type: count_distinct
    filters:
    - watched_within_3_days: Yes
    sql: ${user_id}
  - measure: rolling_premium_users_4d
    type: count_distinct
    filters:
    - watched_within_4_days: Yes
    sql: ${user_id}
  - measure: rolling_premium_users_7d
    type: count_distinct
    filters:
    - watched_within_7_days: Yes
    sql: ${user_id}
  - measure: rolling_premium_users_10d
    type: count_distinct
    filters:
    - watched_within_10_days: Yes
    sql: ${user_id}
  - measure: rolling_premium_users_14d
    type: count_distinct
    filters:
    - watched_within_14_days: Yes
    sql: ${user_id}
  - measure: rolling_premium_users_21d
    type: count_distinct
    filters:
    - watched_within_21_days: Yes
    sql: ${user_id}
  - measure: rolling_premium_users_30d
    type: count_distinct
    filters:
    - watched_within_30_days: Yes
    sql: ${user_id}

Contents

  • rolling_premium_users.sql
  • rolling_premium_users.sql
  • rolling_premium_users.view.lkml
  • rolling_premium_users.view.lookml