dbt Game development

Session Facts

Session Facts model for game development.

inferred

Blocks

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

SELECT
s.user_id AS user_id
, s.start AS start
, (CASE s.user_id
  WHEN @curUser
  THEN @curRow := @curRow + 1
  ELSE @curRow := 1 AND @curUser := s.user_id END) AS sequence_number
, s.credit_amount_usd AS credit_amount_usd
FROM
  (SELECT
    s1.user_id AS user_id
    , s1.start AS start
    , s1.end AS end
    , SUM(c.currency_amount * c.payout_foreign_exchange_rate) AS credit_amount_usd
  FROM public_sessions AS s1
  JOIN public_credits AS c
  ON s1.user_id = c.user_id
  AND s1.end > c.time AND s1.start < c.time
  GROUP BY 1,2,3
  ORDER BY s1.user_id, s1.start ASC) AS s,
(SELECT @curRow := 0, @curUser := '') r
GROUP BY 1,2,3,4

# models/schema.yml
version: 2

models:
  - name: session_facts
    columns:
      - name: id
        tests:
          - unique
          - not_null
      - name: sequence_number
      - name: has_credits
      - name: credit_amount_usd
      - name: days_since_signup

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.
session_facts.sql · 22 lines
source-preserved validation: not checked
SELECT
s.user_id AS user_id
, s.start AS start
, (CASE s.user_id
  WHEN @curUser
  THEN @curRow := @curRow + 1
  ELSE @curRow := 1 AND @curUser := s.user_id END) AS sequence_number
, s.credit_amount_usd AS credit_amount_usd
FROM
  (SELECT
    s1.user_id AS user_id
    , s1.start AS start
    , s1.end AS end
    , SUM(c.currency_amount * c.payout_foreign_exchange_rate) AS credit_amount_usd
  FROM public_sessions AS s1
  JOIN public_credits AS c
  ON s1.user_id = c.user_id
  AND s1.end > c.time AND s1.start < c.time
  GROUP BY 1,2,3
  ORDER BY s1.user_id, s1.start ASC) AS s,
(SELECT @curRow := 0, @curUser := '') r
GROUP BY 1,2,3,4
session_facts.view.lkml · 84 lines
inferred
view: session_facts {
  derived_table: {
    sql: SELECT
s.user_id AS user_id
, s.start AS start
, (CASE s.user_id
  WHEN @curUser
  THEN @curRow := @curRow + 1
  ELSE @curRow := 1 AND @curUser := s.user_id END) AS sequence_number
, s.credit_amount_usd AS credit_amount_usd
FROM
  (SELECT
    s1.user_id AS user_id
    , s1.start AS start
    , s1.end AS end
    , SUM(c.currency_amount * c.payout_foreign_exchange_rate) AS credit_amount_usd
  FROM public_sessions AS s1
  JOIN public_credits AS c
  ON s1.user_id = c.user_id
  AND s1.end > c.time AND s1.start < c.time
  GROUP BY 1,2,3
  ORDER BY s1.user_id, s1.start ASC) AS s,
(SELECT @curRow := 0, @curUser := '') r
GROUP BY 1,2,3,4 ;;
  }

  dimension: id {
    primary_key: yes
    sql: (${TABLE}.user_id * 1000000) + ${TABLE}.sequence_number ;;
  }

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

  dimension: has_credits {
    type: yesno
    sql: ${credit_amount_usd} > 0 ;;
  }

  dimension: credit_amount_usd {
    type: number
    sql: ${TABLE}.credit_amount_usd ;;
  }

  dimension: days_since_signup {
    type: number
    sql: CURDATE() - ${users.account_creation_date} ;;
  }

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

  measure: total_credit_amount_usd {
    type: sum
    sql: ${credit_amount_usd} ;;
  }

  measure: average_credit_amount_usd {
    type: avg
    sql: ${credit_amount_usd} ;;
  }

  measure: session_count {
    type: count
    sql: ${id} ;;
  }

  measure: sessions_with_purchases_count {
    type: count
    hidden: yes
    filters: [has_credits: "True"]
    sql: ${id} ;;
  }

  measure: sessions_with_purchases_percent {
    type: number
    sql: 100.0 * ${sessions_with_purchases_count} / ${session_count} ;;
  }
}
session_facts.view.lookml · 63 lines
source-preserved
- view: session_facts
  derived_table:
    sql: SELECT
s.user_id AS user_id
, s.start AS start
, (CASE s.user_id
  WHEN @curUser
  THEN @curRow := @curRow + 1
  ELSE @curRow := 1 AND @curUser := s.user_id END) AS sequence_number
, s.credit_amount_usd AS credit_amount_usd
FROM
  (SELECT
    s1.user_id AS user_id
    , s1.start AS start
    , s1.end AS end
    , SUM(c.currency_amount * c.payout_foreign_exchange_rate) AS credit_amount_usd
  FROM public_sessions AS s1
  JOIN public_credits AS c
  ON s1.user_id = c.user_id
  AND s1.end > c.time AND s1.start < c.time
  GROUP BY 1,2,3
  ORDER BY s1.user_id, s1.start ASC) AS s,
(SELECT @curRow := 0, @curUser := '') r
GROUP BY 1,2,3,4
  fields:
  - dimension: id
    primary_key: true
    sql: (${TABLE}.user_id * 1000000) + ${TABLE}.sequence_number
  - dimension: sequence_number
    type: int
    sql: ${TABLE}.sequence_number
  - dimension: has_credits
    type: yesno
    sql: ${credit_amount_usd} > 0
  - dimension: credit_amount_usd
    type: number
    sql: ${TABLE}.credit_amount_usd
  - dimension: days_since_signup
    type: number
    sql: CURDATE() - ${users.account_creation_date}
  - dimension_group: session_start
    type: time
    timeframes:
    - time
    - date
    sql: ${TABLE}.start
  - measure: total_credit_amount_usd
    type: sum
    sql: ${credit_amount_usd}
  - measure: average_credit_amount_usd
    type: avg
    sql: ${credit_amount_usd}
  - measure: session_count
    type: count
    sql: ${id}
  - measure: sessions_with_purchases_count
    type: count
    filters:
    - has_credits: True
    sql: ${id}
  - measure: sessions_with_purchases_percent
    type: number
    sql: 100.0 * ${sessions_with_purchases_count} / ${session_count}

Contents

  • session_facts.sql
  • session_facts.sql
  • session_facts.view.lkml
  • session_facts.view.lookml