dbt Advertising automotive

Page Views

Page Views model for advertising automotive.

inferred

Blocks

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

SELECT
  e.app_id,
  domain_userid,
  domain_sessionidx,
  event_id,
  CASE WHEN t.app_id IS NULL THEN collector_tstamp ELSE convert_timezone('UTC', t.timezone_offset, collector_tstamp) END AS collector_tstamp,
  FIRST_VALUE (collector_tstamp) OVER (
    PARTITION BY e.app_id, domain_userid, domain_sessionidx
    ORDER BY collector_tstamp
    ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING
  )  AS next_page_view_tstamp,
  page_urlhost,
  page_urlpath,
  page_urlhost || page_urlpath AS page_url,
  timezone_offset
FROM atomic.events e
LEFT JOIN reference_data.timezones t
ON e.app_id = t.app_id
WHERE event LIKE 'page_view'

# models/schema.yml
version: 2

models:
  - name: page_views
    columns:
      - name: application_id
      - name: user_id
      - name: session_index
      - name: page_url
      - name: url_host
      - name: url_path
      - name: page_view_id
      - name: timestamp
      - name: next_page_view_timestamp
      - name: duration

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.
page_views.sql · 19 lines
source-preserved validation: parses
SELECT
  e.app_id,
  domain_userid,
  domain_sessionidx,
  event_id,
  CASE WHEN t.app_id IS NULL THEN collector_tstamp ELSE convert_timezone('UTC', t.timezone_offset, collector_tstamp) END AS collector_tstamp,
  FIRST_VALUE (collector_tstamp) OVER (
    PARTITION BY e.app_id, domain_userid, domain_sessionidx
    ORDER BY collector_tstamp
    ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING
  )  AS next_page_view_tstamp,
  page_urlhost,
  page_urlpath,
  page_urlhost || page_urlpath AS page_url,
  timezone_offset
FROM atomic.events e
LEFT JOIN reference_data.timezones t
ON e.app_id = t.app_id
WHERE event LIKE 'page_view'
page_views.view.lkml · 89 lines
inferred
view: page_views {
  derived_table: {
    sql: SELECT
  e.app_id,
  domain_userid,
  domain_sessionidx,
  event_id,
  CASE WHEN t.app_id IS NULL THEN collector_tstamp ELSE convert_timezone('UTC', t.timezone_offset, collector_tstamp) END AS collector_tstamp,
  FIRST_VALUE (collector_tstamp) OVER (
    PARTITION BY e.app_id, domain_userid, domain_sessionidx
    ORDER BY collector_tstamp
    ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING
  )  AS next_page_view_tstamp,
  page_urlhost,
  page_urlpath,
  page_urlhost || page_urlpath AS page_url,
  timezone_offset
FROM atomic.events e
LEFT JOIN reference_data.timezones t
ON e.app_id = t.app_id
WHERE event LIKE 'page_view' ;;
  }

  dimension: application_id {
    sql: ${TABLE}.app_id ;;
  }

  dimension: user_id {
    sql: ${TABLE}.domain_userid ;;
  }

  dimension: session_index {
    sql: ${TABLE}.domain_sessionidx ;;
  }

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

  dimension: url_host {
    sql: ${TABLE}.page_urlhost ;;
  }

  dimension: url_path {
    sql: ${TABLE}.page_urlpath ;;
  }

  dimension: page_view_id {
    sql: ${TABLE}.event_id ;;
  }

  dimension: timestamp {
    sql: ${TABLE}.collector_tstamp ;;
  }

  dimension: next_page_view_timestamp {
    sql: convert_timezone('UTC', ${TABLE}.timezone_offset, ${TABLE}.next_page_view_tstamp) ;;
  }

  dimension: duration {
    sql: EXTRACT(EPOCH FROM ${next_page_view_timestamp} - ${timestamp}) ;;
  }

  dimension_group: timestamp {
    type: time
    timeframes: [time, hour, date, week, month]
    sql: ${TABLE}.collector_tstamp ;;
  }

  measure: page_views_count {
    type: count_distinct
    sql: ${page_view_id} ;;
  }

  measure: distinct_pages_count {
    type: count_distinct
    sql: ${page_url} ;;
  }

  measure: visitors_count {
    type: count_distinct
    sql: ${user_id} ;;
  }

  measure: sessions_count {
    type: count_distinct
    sql: (${user_id} || ${session_index}) ;;
  }
}
page_views.view.lookml · 63 lines
source-preserved
- view: page_views
  derived_table:
    sql: SELECT
  e.app_id,
  domain_userid,
  domain_sessionidx,
  event_id,
  CASE WHEN t.app_id IS NULL THEN collector_tstamp ELSE convert_timezone('UTC', t.timezone_offset, collector_tstamp) END AS collector_tstamp,
  FIRST_VALUE (collector_tstamp) OVER (
    PARTITION BY e.app_id, domain_userid, domain_sessionidx
    ORDER BY collector_tstamp
    ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING
  )  AS next_page_view_tstamp,
  page_urlhost,
  page_urlpath,
  page_urlhost || page_urlpath AS page_url,
  timezone_offset
FROM atomic.events e
LEFT JOIN reference_data.timezones t
ON e.app_id = t.app_id
WHERE event LIKE 'page_view'
  fields:
  - dimension: application_id
    sql: ${TABLE}.app_id
  - dimension: user_id
    sql: ${TABLE}.domain_userid
  - dimension: session_index
    sql: ${TABLE}.domain_sessionidx
  - dimension: page_url
    sql: ${TABLE}.page_url
  - dimension: url_host
    sql: ${TABLE}.page_urlhost
  - dimension: url_path
    sql: ${TABLE}.page_urlpath
  - dimension: page_view_id
    sql: ${TABLE}.event_id
  - dimension: timestamp
    sql: ${TABLE}.collector_tstamp
  - dimension: next_page_view_timestamp
    sql: convert_timezone('UTC', ${TABLE}.timezone_offset, ${TABLE}.next_page_view_tstamp)
  - dimension: duration
    sql: EXTRACT(EPOCH FROM ${next_page_view_timestamp} - ${timestamp})
  - dimension_group: timestamp
    type: time
    timeframes:
    - time
    - hour
    - date
    - week
    - month
    sql: ${TABLE}.collector_tstamp
  - measure: page_views_count
    type: count_distinct
    sql: ${page_view_id}
  - measure: distinct_pages_count
    type: count_distinct
    sql: ${page_url}
  - measure: visitors_count
    type: count_distinct
    sql: ${user_id}
  - measure: sessions_count
    type: count_distinct
    sql: (${user_id} || ${session_index})

Contents

  • page_views.sql
  • page_views.sql
  • page_views.view.lkml
  • page_views.view.lookml