dbt Entertainment tech

Sessions

Sessions model for entertainment tech.

inferred

Blocks

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

SELECT
  ss.play_session AS session_id
  , MIN(
      CASE
        WHEN ss.account IS NULL AND ss.sequence = 0 AND ss.statistic_type = '$os_version'
        THEN ss.statistic_value
        ELSE NULL
      END
    ) AS first_os_version
  , ss.account AS account
  , ss.install AS install
  , SUM(CASE WHEN ss.category = 'MIC_BUTTON_HELD' THEN 1 ELSE 0 END) AS mic_presses
  , SUM(CASE WHEN ss.statistic_type = "ACTIVITY_NAME" THEN 1 ELSE 0 END) AS session_activities
  , SUM(CASE WHEN ss.category = 'ACTIVITY_CONVERSATION_BEGAN' THEN 1 ELSE 0 END) AS session_rooms
  , MIN(ss.time_utc) AS first_event
  , MAX(ss.time_utc) AS last_event
  , COUNT(*) AS session_events
FROM statistic_string AS ss
WHERE ss.application IN ('ShowName', 'TheShowName')
  AND ss.time_utc > '2013-06-01'
GROUP BY session_id

# models/schema.yml
version: 2

models:
  - name: sessions
    columns:
      - name: session_id
        tests:
          - unique
          - not_null
      - name: first_os_version
      - name: session_rooms
      - name: session_activities
      - name: session_events
      - name: install
      - name: account
      - name: mic_presses
      - name: pressed_mic
      - name: session_before_consent
      - name: duration_min
      - name: duration_min_tier
      - name: duration_hour
      - name: history

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.
sessions.sql · 21 lines
source-preserved validation: parses
SELECT
  ss.play_session AS session_id
  , MIN(
      CASE
        WHEN ss.account IS NULL AND ss.sequence = 0 AND ss.statistic_type = '$os_version'
        THEN ss.statistic_value
        ELSE NULL
      END
    ) AS first_os_version
  , ss.account AS account
  , ss.install AS install
  , SUM(CASE WHEN ss.category = 'MIC_BUTTON_HELD' THEN 1 ELSE 0 END) AS mic_presses
  , SUM(CASE WHEN ss.statistic_type = "ACTIVITY_NAME" THEN 1 ELSE 0 END) AS session_activities
  , SUM(CASE WHEN ss.category = 'ACTIVITY_CONVERSATION_BEGAN' THEN 1 ELSE 0 END) AS session_rooms
  , MIN(ss.time_utc) AS first_event
  , MAX(ss.time_utc) AS last_event
  , COUNT(*) AS session_events
FROM statistic_string AS ss
WHERE ss.application IN ('ShowName', 'TheShowName')
  AND ss.time_utc > '2013-06-01'
GROUP BY session_id
sessions.view.lkml · 138 lines
inferred
view: sessions {
  derived_table: {
    sql: SELECT
  ss.play_session AS session_id
  , MIN(
      CASE
        WHEN ss.account IS NULL AND ss.sequence = 0 AND ss.statistic_type = '$os_version'
        THEN ss.statistic_value
        ELSE NULL
      END
    ) AS first_os_version
  , ss.account AS account
  , ss.install AS install
  , SUM(CASE WHEN ss.category = 'MIC_BUTTON_HELD' THEN 1 ELSE 0 END) AS mic_presses
  , SUM(CASE WHEN ss.statistic_type = "ACTIVITY_NAME" THEN 1 ELSE 0 END) AS session_activities
  , SUM(CASE WHEN ss.category = 'ACTIVITY_CONVERSATION_BEGAN' THEN 1 ELSE 0 END) AS session_rooms
  , MIN(ss.time_utc) AS first_event
  , MAX(ss.time_utc) AS last_event
  , COUNT(*) AS session_events
FROM statistic_string AS ss
WHERE ss.application IN ('ShowName', 'TheShowName')
  AND ss.time_utc > '2013-06-01'
GROUP BY session_id ;;
  }

  dimension: session_id {
    primary_key: yes
  }

  dimension: first_os_version {
  }

  dimension: session_rooms {
    type: int
  }

  dimension: session_activities {
    type: int
  }

  dimension: session_events {
    type: int
  }

  dimension: install {
  }

  dimension: account {
  }

  dimension: mic_presses {
    type: int
  }

  dimension: pressed_mic {
    type: yesno
    sql: ${mic_presses} > 0 ;;
  }

  dimension: session_before_consent {
    type: yesno
    sql: ${start_date} < ${account_event_facts.consent_date} ;;
  }

  dimension: duration_min {
    sql: TIMESTAMPDIFF(minute, ${TABLE}.first_event, ${TABLE}.last_event) ;;
  }

  dimension: duration_min_tier {
    type: tier
    sql: ${duration_min} ;;
  }

  dimension: duration_hour {
    type: int
    sql: FLOOR(${duration_min}/60) ;;
  }

  dimension: history {
    sql: ${session_id} ;;
  }

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

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

  measure: count {
    type: count
  }

  measure: percent_of_total {
    type: percent_of_total
    sql: ${count} ;;
  }

  measure: average_duration_min {
    type: avg
    sql: ${duration_min} ;;
  }

  measure: total_duration_min {
    type: sum
    sql: ${duration_min} ;;
  }

  measure: average_duration_hour {
    type: avg
    sql: ${duration_hour} ;;
  }

  measure: total_duration_hour {
    type: sum
    sql: ${duration_hour} ;;
  }

  measure: accounts.count {
    type: count_distinct
    sql: ${TABLE}.account ;;
  }

  measure: sessions_per_user {
    type: number
    sql: ${count}/NULLIF(${accounts.count},0) ;;
  }

  measure: active_days_usage {
    type: count_distinct
    sql: EXTRACT(YEAR_MONTH FROM ${TABLE}.first_event) ;;
  }
}
sessions.view.lookml · 95 lines
source-preserved
- view: sessions
  derived_table:
    sql: SELECT
  ss.play_session AS session_id
  , MIN(
      CASE
        WHEN ss.account IS NULL AND ss.sequence = 0 AND ss.statistic_type = '$os_version'
        THEN ss.statistic_value
        ELSE NULL
      END
    ) AS first_os_version
  , ss.account AS account
  , ss.install AS install
  , SUM(CASE WHEN ss.category = 'MIC_BUTTON_HELD' THEN 1 ELSE 0 END) AS mic_presses
  , SUM(CASE WHEN ss.statistic_type = "ACTIVITY_NAME" THEN 1 ELSE 0 END) AS session_activities
  , SUM(CASE WHEN ss.category = 'ACTIVITY_CONVERSATION_BEGAN' THEN 1 ELSE 0 END) AS session_rooms
  , MIN(ss.time_utc) AS first_event
  , MAX(ss.time_utc) AS last_event
  , COUNT(*) AS session_events
FROM statistic_string AS ss
WHERE ss.application IN ('ShowName', 'TheShowName')
  AND ss.time_utc > '2013-06-01'
GROUP BY session_id
  fields:
  - dimension: session_id
    primary_key: true
  - dimension: first_os_version
  - dimension: session_rooms
    type: int
  - dimension: session_activities
    type: int
  - dimension: session_events
    type: int
  - dimension: install
  - dimension: account
  - dimension: mic_presses
    type: int
  - dimension: pressed_mic
    type: yesno
    sql: ${mic_presses} > 0
  - dimension: session_before_consent
    type: yesno
    sql: ${start_date} < ${account_event_facts.consent_date}
  - dimension: duration_min
    sql: TIMESTAMPDIFF(minute, ${TABLE}.first_event, ${TABLE}.last_event)
  - dimension: duration_min_tier
    type: tier
    sql: ${duration_min}
  - dimension: duration_hour
    type: int
    sql: FLOOR(${duration_min}/60)
  - dimension: history
    sql: ${session_id}
  - dimension_group: start
    type: time
    timeframes:
    - time
    - date
    - week
    - month
    sql: ${TABLE}.first_event
  - dimension_group: end
    type: time
    timeframes:
    - time
    - date
    - week
    - month
    sql: ${TABLE}.last_event
  - measure: count
    type: count
  - measure: percent_of_total
    type: percent_of_total
    sql: ${count}
  - measure: average_duration_min
    type: avg
    sql: ${duration_min}
  - measure: total_duration_min
    type: sum
    sql: ${duration_min}
  - measure: average_duration_hour
    type: avg
    sql: ${duration_hour}
  - measure: total_duration_hour
    type: sum
    sql: ${duration_hour}
  - measure: accounts.count
    type: count_distinct
    sql: ${TABLE}.account
  - measure: sessions_per_user
    type: number
    sql: ${count}/NULLIF(${accounts.count},0)
  - measure: active_days_usage
    type: count_distinct
    sql: EXTRACT(YEAR_MONTH FROM ${TABLE}.first_event)

Contents

  • sessions.sql
  • sessions.sql
  • sessions.view.lkml
  • sessions.view.lookml