SQL Video editing

User Sub Reg Aggregates

User Sub Reg Aggregates model for video editing.

source-preserved

Blocks

user_sub_reg_aggregates.sql · 96 lines
inferred
-- models/user_sub_reg_aggregates.sql
{{ config(materialized='table') }}

SELECT 'brand new subs' AS type
  , transactions.id AS sub_id
  , NULL AS order_id
  , transactions.user_id AS user_id
  , transactions.created_at AS created
  , 0 AS total_cost
FROM transactions
LEFT JOIN users
ON users.id = transactions.user_id
WHERE DATEDIFF(mm, transactions.processed_at, users.created_at) = 0
AND transactions.processed_at >= <% parameter start_date %>
AND transactions.rate_id IS NOT NULL

UNION ALL

SELECT 'new subs' AS type
  , id AS sub_id
  , NULL AS order_id
  , user_id AS user_id
  , created_at AS created
  , 0 AS total_cost
FROM (SELECT id
        , user_id
        , created_at
        , rate_id
        , processed_at
        , RANK() OVER(PARTITION BY user_id ORDER BY created_at) AS order_sequence
      FROM transactions
      WHERE transactions.rate_id IS NOT NULL) AS transactions
WHERE order_sequence = 1
AND transactions.processed_at >= <% parameter start_date %>

UNION ALL

SELECT 'renewal subs' AS type
  , id AS sub_id
  , NULL AS order_id
  , user_id AS user_id
  , created_at AS created
  , 0 AS total_cost
FROM (SELECT id
        , user_id
        , created_at
        , rate_id
        , processed_at
        , RANK() OVER(PARTITION BY user_id ORDER BY created_at) AS order_sequence
      FROM transactions
      WHERE transactions.rate_id IS NOT NULL) AS transactions
WHERE order_sequence > 1
AND transactions.processed_at >= <% parameter start_date %>

UNION ALL

SELECT 'new bookings' AS type
  , NULL AS sub_id
  , id AS order_id
  , user_id AS user_id
  , created_at AS created
  , ISNULL(exchanged_total_cost, total_cost) AS total_cost
FROM (SELECT id
        , user_id
        , created_at
        , rate_id
        , processed_at
        , exchanged_total_cost
        , total_cost
        , RANK() OVER(PARTITION BY user_id ORDER BY created_at) AS order_sequence
      FROM transactions
      WHERE transactions.rate_id IS NOT NULL) AS transactions
WHERE order_sequence > 1
AND transactions.processed_at >= <% parameter start_date %>

UNION ALL

SELECT 'registration' AS type
  , NULL AS sub_id
  , NULL AS order_id
  , id AS user_id
  , created_at AS created
  , NULL AS total_cost
FROM users

# models/schema.yml
version: 2

models:
  - name: user_sub_reg_aggregates
    columns:
      - name: type
      - name: subscription_id
      - name: order_id
      - name: user_id
      - name: total_cost

Assumptions

  • materialized='table' inferred from a LookML persist hint (persist_for / datagroup / sql_trigger_value).
  • schema.yml columns come from view dimensions; a primary_key dimension gets unique + not_null tests.
user_sub_reg_aggregates.sql · 81 lines
source-preserved validation: not checked
SELECT 'brand new subs' AS type
  , transactions.id AS sub_id
  , NULL AS order_id
  , transactions.user_id AS user_id
  , transactions.created_at AS created
  , 0 AS total_cost
FROM transactions
LEFT JOIN users
ON users.id = transactions.user_id
WHERE DATEDIFF(mm, transactions.processed_at, users.created_at) = 0
AND transactions.processed_at >= <% parameter start_date %>
AND transactions.rate_id IS NOT NULL

UNION ALL

SELECT 'new subs' AS type
  , id AS sub_id
  , NULL AS order_id
  , user_id AS user_id
  , created_at AS created
  , 0 AS total_cost
FROM (SELECT id
        , user_id
        , created_at
        , rate_id
        , processed_at
        , RANK() OVER(PARTITION BY user_id ORDER BY created_at) AS order_sequence
      FROM transactions
      WHERE transactions.rate_id IS NOT NULL) AS transactions
WHERE order_sequence = 1
AND transactions.processed_at >= <% parameter start_date %>

UNION ALL

SELECT 'renewal subs' AS type
  , id AS sub_id
  , NULL AS order_id
  , user_id AS user_id
  , created_at AS created
  , 0 AS total_cost
FROM (SELECT id
        , user_id
        , created_at
        , rate_id
        , processed_at
        , RANK() OVER(PARTITION BY user_id ORDER BY created_at) AS order_sequence
      FROM transactions
      WHERE transactions.rate_id IS NOT NULL) AS transactions
WHERE order_sequence > 1
AND transactions.processed_at >= <% parameter start_date %>

UNION ALL

SELECT 'new bookings' AS type
  , NULL AS sub_id
  , id AS order_id
  , user_id AS user_id
  , created_at AS created
  , ISNULL(exchanged_total_cost, total_cost) AS total_cost
FROM (SELECT id
        , user_id
        , created_at
        , rate_id
        , processed_at
        , exchanged_total_cost
        , total_cost
        , RANK() OVER(PARTITION BY user_id ORDER BY created_at) AS order_sequence
      FROM transactions
      WHERE transactions.rate_id IS NOT NULL) AS transactions
WHERE order_sequence > 1
AND transactions.processed_at >= <% parameter start_date %>

UNION ALL

SELECT 'registration' AS type
  , NULL AS sub_id
  , NULL AS order_id
  , id AS user_id
  , created_at AS created
  , NULL AS total_cost
FROM users
user_sub_reg_aggregates.view.lkml · 195 lines
inferred
view: user_sub_reg_aggregates {
  derived_table: {
    sql: SELECT 'brand new subs' AS type
  , transactions.id AS sub_id
  , NULL AS order_id
  , transactions.user_id AS user_id
  , transactions.created_at AS created
  , 0 AS total_cost
FROM transactions
LEFT JOIN users
ON users.id = transactions.user_id
WHERE DATEDIFF(mm, transactions.processed_at, users.created_at) = 0
AND transactions.processed_at >= <% parameter start_date %>
AND transactions.rate_id IS NOT NULL

UNION ALL

SELECT 'new subs' AS type
  , id AS sub_id
  , NULL AS order_id
  , user_id AS user_id
  , created_at AS created
  , 0 AS total_cost
FROM (SELECT id
        , user_id
        , created_at
        , rate_id
        , processed_at
        , RANK() OVER(PARTITION BY user_id ORDER BY created_at) AS order_sequence
      FROM transactions
      WHERE transactions.rate_id IS NOT NULL) AS transactions
WHERE order_sequence = 1
AND transactions.processed_at >= <% parameter start_date %>

UNION ALL

SELECT 'renewal subs' AS type
  , id AS sub_id
  , NULL AS order_id
  , user_id AS user_id
  , created_at AS created
  , 0 AS total_cost
FROM (SELECT id
        , user_id
        , created_at
        , rate_id
        , processed_at
        , RANK() OVER(PARTITION BY user_id ORDER BY created_at) AS order_sequence
      FROM transactions
      WHERE transactions.rate_id IS NOT NULL) AS transactions
WHERE order_sequence > 1
AND transactions.processed_at >= <% parameter start_date %>

UNION ALL

SELECT 'new bookings' AS type
  , NULL AS sub_id
  , id AS order_id
  , user_id AS user_id
  , created_at AS created
  , ISNULL(exchanged_total_cost, total_cost) AS total_cost
FROM (SELECT id
        , user_id
        , created_at
        , rate_id
        , processed_at
        , exchanged_total_cost
        , total_cost
        , RANK() OVER(PARTITION BY user_id ORDER BY created_at) AS order_sequence
      FROM transactions
      WHERE transactions.rate_id IS NOT NULL) AS transactions
WHERE order_sequence > 1
AND transactions.processed_at >= <% parameter start_date %>

UNION ALL

SELECT 'registration' AS type
  , NULL AS sub_id
  , NULL AS order_id
  , id AS user_id
  , created_at AS created
  , NULL AS total_cost
FROM users ;;
    persist_for: "2 hours"
  }

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

  dimension: subscription_id {
    type: int
    hidden: yes
    sql: ${TABLE}.subscription_id ;;
  }

  dimension: order_id {
    type: int
    hidden: yes
    sql: ${TABLE}.order_id ;;
  }

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

  dimension: total_cost {
    type: number
    sql: ${TABLE}.total_cost/100 ;;
  }

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

  measure: registrations {
    type: count
    filters: [type: "registration"]
  }

  measure: percent_change_registrations {
    type: percent_of_previous
    sql: ${registrations} ;;
  }

  measure: bookings_count {
    type: count
    filters: [type: "new bookings"]
  }

  measure: percent_change_bookings {
    type: percent_of_previous
    sql: ${bookings_count} ;;
  }

  measure: brand_new_subs {
    type: count
    filters: [type: "brand new subs"]
  }

  measure: percent_change_brand_new_subs {
    type: percent_of_previous
    sql: ${brand_new_subs} ;;
  }

  measure: new_subs {
    type: count
    filters: [type: "new subs"]
  }

  measure: percent_change_new_subs {
    type: percent_of_previous
    sql: ${new_subs} ;;
  }

  measure: renewal_subs {
    type: count
    filters: [type: "renewal subs"]
  }

  measure: percent_change_renewal_subs {
    type: percent_of_previous
    sql: ${renewal_subs} ;;
  }

  measure: total_subs {
    type: number
    sql: ${brand_new_subs} + ${new_subs} + ${renewal_subs} ;;
  }

  measure: percent_change_total_subs {
    type: percent_of_previous
    sql: ${total_subs} ;;
  }

  measure: booking_value {
    type: sum
    sql: ${total_cost} ;;
  }

  measure: percent_change_booking_value {
    type: percent_of_previous
    sql: ${booking_value} ;;
  }

  measure: aov {
    label: "USER AGGREGATES AOV"
    type: number
    sql: ${booking_value} / NULLIF(${bookings_count}, 0) ;;
  }
}
user_sub_reg_aggregates.view.lookml · 161 lines
source-preserved
- view: user_sub_reg_aggregates
  derived_table:
    sql: SELECT 'brand new subs' AS type
  , transactions.id AS sub_id
  , NULL AS order_id
  , transactions.user_id AS user_id
  , transactions.created_at AS created
  , 0 AS total_cost
FROM transactions
LEFT JOIN users
ON users.id = transactions.user_id
WHERE DATEDIFF(mm, transactions.processed_at, users.created_at) = 0
AND transactions.processed_at >= <% parameter start_date %>
AND transactions.rate_id IS NOT NULL

UNION ALL

SELECT 'new subs' AS type
  , id AS sub_id
  , NULL AS order_id
  , user_id AS user_id
  , created_at AS created
  , 0 AS total_cost
FROM (SELECT id
        , user_id
        , created_at
        , rate_id
        , processed_at
        , RANK() OVER(PARTITION BY user_id ORDER BY created_at) AS order_sequence
      FROM transactions
      WHERE transactions.rate_id IS NOT NULL) AS transactions
WHERE order_sequence = 1
AND transactions.processed_at >= <% parameter start_date %>

UNION ALL

SELECT 'renewal subs' AS type
  , id AS sub_id
  , NULL AS order_id
  , user_id AS user_id
  , created_at AS created
  , 0 AS total_cost
FROM (SELECT id
        , user_id
        , created_at
        , rate_id
        , processed_at
        , RANK() OVER(PARTITION BY user_id ORDER BY created_at) AS order_sequence
      FROM transactions
      WHERE transactions.rate_id IS NOT NULL) AS transactions
WHERE order_sequence > 1
AND transactions.processed_at >= <% parameter start_date %>

UNION ALL

SELECT 'new bookings' AS type
  , NULL AS sub_id
  , id AS order_id
  , user_id AS user_id
  , created_at AS created
  , ISNULL(exchanged_total_cost, total_cost) AS total_cost
FROM (SELECT id
        , user_id
        , created_at
        , rate_id
        , processed_at
        , exchanged_total_cost
        , total_cost
        , RANK() OVER(PARTITION BY user_id ORDER BY created_at) AS order_sequence
      FROM transactions
      WHERE transactions.rate_id IS NOT NULL) AS transactions
WHERE order_sequence > 1
AND transactions.processed_at >= <% parameter start_date %>

UNION ALL

SELECT 'registration' AS type
  , NULL AS sub_id
  , NULL AS order_id
  , id AS user_id
  , created_at AS created
  , NULL AS total_cost
FROM users
    persist_for: 2 hours
  fields:
  - dimension: type
    sql: ${TABLE}.type
  - dimension: subscription_id
    type: int
    hidden: true
    sql: ${TABLE}.subscription_id
  - dimension: order_id
    type: int
    hidden: true
    sql: ${TABLE}.order_id
  - dimension: user_id
    type: int
    hidden: true
    sql: ${TABLE}.user_id
  - dimension: total_cost
    type: number
    sql: ${TABLE}.total_cost/100
  - dimension_group: created
    type: time
    timeframes:
    - time
    - date
    - week
    - month
    sql: ${TABLE}.created
  - measure: registrations
    type: count
    filters:
    - type: registration
  - measure: percent_change_registrations
    type: percent_of_previous
    sql: ${registrations}
  - measure: bookings_count
    type: count
    filters:
    - type: new bookings
  - measure: percent_change_bookings
    type: percent_of_previous
    sql: ${bookings_count}
  - measure: brand_new_subs
    type: count
    filters:
    - type: brand new subs
  - measure: percent_change_brand_new_subs
    type: percent_of_previous
    sql: ${brand_new_subs}
  - measure: new_subs
    type: count
    filters:
    - type: new subs
  - measure: percent_change_new_subs
    type: percent_of_previous
    sql: ${new_subs}
  - measure: renewal_subs
    type: count
    filters:
    - type: renewal subs
  - measure: percent_change_renewal_subs
    type: percent_of_previous
    sql: ${renewal_subs}
  - measure: total_subs
    type: number
    sql: ${brand_new_subs} + ${new_subs} + ${renewal_subs}
  - measure: percent_change_total_subs
    type: percent_of_previous
    sql: ${total_subs}
  - measure: booking_value
    type: sum
    sql: ${total_cost}
  - measure: percent_change_booking_value
    type: percent_of_previous
    sql: ${booking_value}
  - measure: aov
    type: number
    label: USER AGGREGATES AOV
    sql: ${booking_value} / NULLIF(${bookings_count}, 0)

Contents

  • user_sub_reg_aggregates.sql
  • user_sub_reg_aggregates.sql
  • user_sub_reg_aggregates.view.lkml
  • user_sub_reg_aggregates.view.lookml