dbt
Saas video platform
Video Pct View Map
Video Pct View Map model for saas video platform.
inferred
Blocks
video_pct_view_map.sql · 42 lines
inferred
-- models/video_pct_view_map.sql
{{ config(materialized='view') }}
SELECT
generate_series AS percent_of_video_duration
,events.id AS event_id
,events.media_length AS video_duration
,events.resource_id AS resource_id
,events.user_id AS user_id
,events.viewed_seconds AS sesseion_length
,'Start' AS start_stop_type
,ROUND ( 100.0 * (substring(events.view_range::text FROM 2 FOR (position(',' in events.view_range::text) - 2))::integer / events.media_length),0) as start_percent
,ROUND ( 100.0 * (substring(events.view_range::text FROM(position(',' in events.view_range::text) + 1) FOR (length(events.view_range::text) - 1 - position(',' in events.view_range::text)))::integer - 1 ) / events.media_length , 0) as end_percent
FROM events
LEFT OUTER JOIN generate_series (0,100)
ON
generate_series >= ROUND ( 100.0 * (substring(events.view_range::text FROM 2 FOR (position(',' in events.view_range::text) - 2))::integer / events.media_length),0)
AND
generate_series <= ROUND ( 100.0 * (substring(events.view_range::text FROM(position(',' in events.view_range::text) + 1) FOR (length(events.view_range::text) - 1 - position(',' in events.view_range::text)))::integer - 1 ) / events.media_length , 0)
WHERE
events.event_type = 'view_segment'
AND {% condition video_resource_map.resource_id %} resource_id {% endcondition %}
# models/schema.yml
version: 2
models:
- name: video_pct_view_map
columns:
- name: percent_of_video_duration
- name: event_id
- name: video_duration
- name: resource_id
- name: user_id
- name: sesseion_length
- name: session_length_as_pct
- name: start_stop_type
- name: start_percent
- name: end_percent
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.
video_pct_view_map.sql · 22 lines
source-preserved
validation: not checked
SELECT
generate_series AS percent_of_video_duration
,events.id AS event_id
,events.media_length AS video_duration
,events.resource_id AS resource_id
,events.user_id AS user_id
,events.viewed_seconds AS sesseion_length
,'Start' AS start_stop_type
,ROUND ( 100.0 * (substring(events.view_range::text FROM 2 FOR (position(',' in events.view_range::text) - 2))::integer / events.media_length),0) as start_percent
,ROUND ( 100.0 * (substring(events.view_range::text FROM(position(',' in events.view_range::text) + 1) FOR (length(events.view_range::text) - 1 - position(',' in events.view_range::text)))::integer - 1 ) / events.media_length , 0) as end_percent
FROM events
LEFT OUTER JOIN generate_series (0,100)
ON
generate_series >= ROUND ( 100.0 * (substring(events.view_range::text FROM 2 FOR (position(',' in events.view_range::text) - 2))::integer / events.media_length),0)
AND
generate_series <= ROUND ( 100.0 * (substring(events.view_range::text FROM(position(',' in events.view_range::text) + 1) FOR (length(events.view_range::text) - 1 - position(',' in events.view_range::text)))::integer - 1 ) / events.media_length , 0)
WHERE
events.event_type = 'view_segment'
AND {% condition video_resource_map.resource_id %} resource_id {% endcondition %}
video_pct_view_map.view.lkml · 82 lines
inferred
view: video_pct_view_map {
derived_table: {
sql: SELECT
generate_series AS percent_of_video_duration
,events.id AS event_id
,events.media_length AS video_duration
,events.resource_id AS resource_id
,events.user_id AS user_id
,events.viewed_seconds AS sesseion_length
,'Start' AS start_stop_type
,ROUND ( 100.0 * (substring(events.view_range::text FROM 2 FOR (position(',' in events.view_range::text) - 2))::integer / events.media_length),0) as start_percent
,ROUND ( 100.0 * (substring(events.view_range::text FROM(position(',' in events.view_range::text) + 1) FOR (length(events.view_range::text) - 1 - position(',' in events.view_range::text)))::integer - 1 ) / events.media_length , 0) as end_percent
FROM events
LEFT OUTER JOIN generate_series (0,100)
ON
generate_series >= ROUND ( 100.0 * (substring(events.view_range::text FROM 2 FOR (position(',' in events.view_range::text) - 2))::integer / events.media_length),0)
AND
generate_series <= ROUND ( 100.0 * (substring(events.view_range::text FROM(position(',' in events.view_range::text) + 1) FOR (length(events.view_range::text) - 1 - position(',' in events.view_range::text)))::integer - 1 ) / events.media_length , 0)
WHERE
events.event_type = 'view_segment'
AND {% condition video_resource_map.resource_id %} resource_id {% endcondition %} ;;
}
dimension: percent_of_video_duration {
type: number
sql: ${TABLE}.percent_of_video_duration ;;
}
dimension: event_id {
type: number
sql: ${TABLE}.event_id ;;
}
dimension: video_duration {
type: number
sql: ${TABLE}.video_duration ;;
}
dimension: resource_id {
sql: ${TABLE}.resource_id ;;
}
dimension: user_id {
sql: ${TABLE}.user_id ;;
}
dimension: sesseion_length {
type: number
sql: ${TABLE}.sesseion_length ;;
}
dimension: session_length_as_pct {
type: number
sql: 100.0 * ${sesseion_length} / NULLIF(${video_duration},0) ;;
}
dimension: start_stop_type {
sql: ${TABLE}.start_stop_type ;;
}
dimension: start_percent {
type: number
sql: ${TABLE}.start_percent ;;
}
dimension: end_percent {
type: number
sql: ${TABLE}.end_percent ;;
}
measure: count_watching {
type: count
}
measure: count_distinct_users {
type: count_distinct
sql: ${user_id} ;;
}
}
video_pct_view_map.view.lookml · 57 lines
source-preserved
- view: video_pct_view_map
derived_table:
sql: SELECT
generate_series AS percent_of_video_duration
,events.id AS event_id
,events.media_length AS video_duration
,events.resource_id AS resource_id
,events.user_id AS user_id
,events.viewed_seconds AS sesseion_length
,'Start' AS start_stop_type
,ROUND ( 100.0 * (substring(events.view_range::text FROM 2 FOR (position(',' in events.view_range::text) - 2))::integer / events.media_length),0) as start_percent
,ROUND ( 100.0 * (substring(events.view_range::text FROM(position(',' in events.view_range::text) + 1) FOR (length(events.view_range::text) - 1 - position(',' in events.view_range::text)))::integer - 1 ) / events.media_length , 0) as end_percent
FROM events
LEFT OUTER JOIN generate_series (0,100)
ON
generate_series >= ROUND ( 100.0 * (substring(events.view_range::text FROM 2 FOR (position(',' in events.view_range::text) - 2))::integer / events.media_length),0)
AND
generate_series <= ROUND ( 100.0 * (substring(events.view_range::text FROM(position(',' in events.view_range::text) + 1) FOR (length(events.view_range::text) - 1 - position(',' in events.view_range::text)))::integer - 1 ) / events.media_length , 0)
WHERE
events.event_type = 'view_segment'
AND {% condition video_resource_map.resource_id %} resource_id {% endcondition %}
fields:
- dimension: percent_of_video_duration
type: number
sql: ${TABLE}.percent_of_video_duration
- dimension: event_id
type: number
sql: ${TABLE}.event_id
- dimension: video_duration
type: number
sql: ${TABLE}.video_duration
- dimension: resource_id
sql: ${TABLE}.resource_id
- dimension: user_id
sql: ${TABLE}.user_id
- dimension: sesseion_length
type: number
sql: ${TABLE}.sesseion_length
- dimension: session_length_as_pct
type: number
sql: 100.0 * ${sesseion_length} / NULLIF(${video_duration},0)
- dimension: start_stop_type
sql: ${TABLE}.start_stop_type
- dimension: start_percent
type: number
sql: ${TABLE}.start_percent
- dimension: end_percent
type: number
sql: ${TABLE}.end_percent
- measure: count_watching
type: count
- measure: count_distinct_users
type: count_distinct
sql: ${user_id}
Contents
- video_pct_view_map.sql
- video_pct_view_map.sql
- video_pct_view_map.view.lkml
- video_pct_view_map.view.lookml