SQL
Saas crm
Spot Campaign Stats Rollup
Spot Campaign Stats Rollup model for saas crm.
source-preserved
Blocks
spot_campaign_stats_rollup.sql · 164 lines
inferred
-- models/spot_campaign_stats_rollup.sql
{{ config(materialized='view') }}
SELECT
b.pitch_site_id as pitch_site_id,
b.tenant_id as tenant_id,
MIN(b.start_date) as first_start_date,
MIN(b.lead_date) as first_lead_date,
MIN(b.visit100_date) as first_vis100_date,
MIN(b.first_campaign_date) as campaign_first_date,
sum(b.visitors) as visitors,
sum(b.views) as views,
sum(b.cta_submits) as cta_submits,
sum(b.unique_cta_submits) as unique_cta_submits,
sum(b.cta_clicks) as cta_clicks,
sum(b.leads) as leads,
sum(b.clicks) as clicks,
sum(b.total_spend) as total_spend,
sum(b.impressions) as impressions,
min(b.pitch_sites_count) as total_spots
FROM (
SELECT
d.pitch_site_id,
d.tenant_id,
d.start_date,
MIN(d.start_date) OVER (PARTITION BY tenant_id) as first_campaign_date,
d.lead_date,
d.visitors,
CASE WHEN d.sumvis >=100 AND d.sumvis IS NOT NULL THEN d.start_date
ELSE NULL
END
AS visit100_date,
d.views,
d.cta_submits,
d.unique_cta_submits,
d.cta_clicks,
d.leads,
d.clicks,
d.total_spend,
d.impressions,
d.pitch_sites_count
FROM (
SELECT
a.pitch_site_id,
a.tenant_id,
a.start_date,
a.lead_date,
a.visitors,
sum(a.visitors) OVER (PARTITION BY a.pitch_site_id ORDER BY a.start_date ROWS UNBOUNDED PRECEDING) as sumvis,
a.views,
a.cta_submits,
a.unique_cta_submits,
a.cta_clicks,
a.leads,
a.clicks,
a.total_spend,
a.impressions,
a.pitch_sites_count
FROM (
SELECT
z.engagement_id,
z.ad_id,
z.provider_ad_id_all,
COALESCE(z.engagement_pitch_site_id, h.pitch_site_id) AS pitch_site_id,
COALESCE(g.tenant_id, z.tenant_id, p.tenant_id) as tenant_id,
z.start_date,
CASE WHEN z.cta_submits > 0 AND z.cta_submits IS NOT NULL THEN z.start_date
ELSE NULL
END
AS lead_date,
z.visitors,
z.views,
z.cta_submits,
z.unique_cta_submits,
z.cta_clicks,
z.leads,
z.clicks,
z.total_spend,
z.impressions,
hh.pitch_sites_count
FROM (
SELECT
x.id as engagement_id,
y.id as ad_id,
x.pitch_site_id as engagement_pitch_site_id,
CASE WHEN x.provider_ad_id IS NOT NULL THEN x.provider_ad_id
ELSE y.provider_ad_id
END
AS provider_ad_id_all,
CASE WHEN x.start_date IS NOT NULL then x.start_date
ELSE y.start_date
END
as start_date,
y.tenant_id,
x.visitors,
x.views,
x.cta_submits,
x.unique_cta_submits,
x.cta_clicks,
x.leads,
y.clicks,
y.total_spend,
y.impressions
FROM (
SELECT
*
FROM
public_schema.provider_engagement_stats
) as x
FULL OUTER JOIN
public_schema.provider_ad_stats y
ON
x.provider_ad_id = y.provider_ad_id AND
x.start_date = y.start_date
) as z
LEFT OUTER JOIN
public_schema.pitch_sites g
ON
z.engagement_pitch_site_id = g.id
LEFT OUTER JOIN
public_schema.provider_ads p
ON
z.provider_ad_id_all = p.id
LEFT OUTER JOIN
public_schema.pitch_sites gg
ON
p.pitch_site_id = gg.id
LEFT OUTER JOIN
public_schema.hubs hh
ON
gg.public_url = hh.public_url and z.engagement_pitch_site_id is null
LEFT OUTER JOIN
public_schema.pitch_site_hubs h
ON
hh.id = h.hub_id
) as a
) as d
) as b
GROUP BY
b.pitch_site_id, b.tenant_id
# models/schema.yml
version: 2
models:
- name: spot_campaign_stats_rollup
columns:
- name: pitch_sites_count
- name: pitch_site_id
- name: tenant_id
- name: lead_time
- name: vis100_time
- name: message_leads
- name: leads_without_messages
- name: leads
- name: template
- name: visitors
- name: views
- name: clicks
- name: impressions
- name: total_spend
- name: cta_clicks
- name: manager
- name: operations_lead
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.
spot_campaign_stats_rollup.sql · 137 lines
source-preserved
validation: parses
SELECT
b.pitch_site_id as pitch_site_id,
b.tenant_id as tenant_id,
MIN(b.start_date) as first_start_date,
MIN(b.lead_date) as first_lead_date,
MIN(b.visit100_date) as first_vis100_date,
MIN(b.first_campaign_date) as campaign_first_date,
sum(b.visitors) as visitors,
sum(b.views) as views,
sum(b.cta_submits) as cta_submits,
sum(b.unique_cta_submits) as unique_cta_submits,
sum(b.cta_clicks) as cta_clicks,
sum(b.leads) as leads,
sum(b.clicks) as clicks,
sum(b.total_spend) as total_spend,
sum(b.impressions) as impressions,
min(b.pitch_sites_count) as total_spots
FROM (
SELECT
d.pitch_site_id,
d.tenant_id,
d.start_date,
MIN(d.start_date) OVER (PARTITION BY tenant_id) as first_campaign_date,
d.lead_date,
d.visitors,
CASE WHEN d.sumvis >=100 AND d.sumvis IS NOT NULL THEN d.start_date
ELSE NULL
END
AS visit100_date,
d.views,
d.cta_submits,
d.unique_cta_submits,
d.cta_clicks,
d.leads,
d.clicks,
d.total_spend,
d.impressions,
d.pitch_sites_count
FROM (
SELECT
a.pitch_site_id,
a.tenant_id,
a.start_date,
a.lead_date,
a.visitors,
sum(a.visitors) OVER (PARTITION BY a.pitch_site_id ORDER BY a.start_date ROWS UNBOUNDED PRECEDING) as sumvis,
a.views,
a.cta_submits,
a.unique_cta_submits,
a.cta_clicks,
a.leads,
a.clicks,
a.total_spend,
a.impressions,
a.pitch_sites_count
FROM (
SELECT
z.engagement_id,
z.ad_id,
z.provider_ad_id_all,
COALESCE(z.engagement_pitch_site_id, h.pitch_site_id) AS pitch_site_id,
COALESCE(g.tenant_id, z.tenant_id, p.tenant_id) as tenant_id,
z.start_date,
CASE WHEN z.cta_submits > 0 AND z.cta_submits IS NOT NULL THEN z.start_date
ELSE NULL
END
AS lead_date,
z.visitors,
z.views,
z.cta_submits,
z.unique_cta_submits,
z.cta_clicks,
z.leads,
z.clicks,
z.total_spend,
z.impressions,
hh.pitch_sites_count
FROM (
SELECT
x.id as engagement_id,
y.id as ad_id,
x.pitch_site_id as engagement_pitch_site_id,
CASE WHEN x.provider_ad_id IS NOT NULL THEN x.provider_ad_id
ELSE y.provider_ad_id
END
AS provider_ad_id_all,
CASE WHEN x.start_date IS NOT NULL then x.start_date
ELSE y.start_date
END
as start_date,
y.tenant_id,
x.visitors,
x.views,
x.cta_submits,
x.unique_cta_submits,
x.cta_clicks,
x.leads,
y.clicks,
y.total_spend,
y.impressions
FROM (
SELECT
*
FROM
public_schema.provider_engagement_stats
) as x
FULL OUTER JOIN
public_schema.provider_ad_stats y
ON
x.provider_ad_id = y.provider_ad_id AND
x.start_date = y.start_date
) as z
LEFT OUTER JOIN
public_schema.pitch_sites g
ON
z.engagement_pitch_site_id = g.id
LEFT OUTER JOIN
public_schema.provider_ads p
ON
z.provider_ad_id_all = p.id
LEFT OUTER JOIN
public_schema.pitch_sites gg
ON
p.pitch_site_id = gg.id
LEFT OUTER JOIN
public_schema.hubs hh
ON
gg.public_url = hh.public_url and z.engagement_pitch_site_id is null
LEFT OUTER JOIN
public_schema.pitch_site_hubs h
ON
hh.id = h.hub_id
) as a
) as d
) as b
GROUP BY
b.pitch_site_id, b.tenant_id
spot_campaign_stats_rollup.view.lkml · 456 lines
inferred
view: spot_campaign_stats_rollup {
derived_table: {
sql: SELECT
b.pitch_site_id as pitch_site_id,
b.tenant_id as tenant_id,
MIN(b.start_date) as first_start_date,
MIN(b.lead_date) as first_lead_date,
MIN(b.visit100_date) as first_vis100_date,
MIN(b.first_campaign_date) as campaign_first_date,
sum(b.visitors) as visitors,
sum(b.views) as views,
sum(b.cta_submits) as cta_submits,
sum(b.unique_cta_submits) as unique_cta_submits,
sum(b.cta_clicks) as cta_clicks,
sum(b.leads) as leads,
sum(b.clicks) as clicks,
sum(b.total_spend) as total_spend,
sum(b.impressions) as impressions,
min(b.pitch_sites_count) as total_spots
FROM (
SELECT
d.pitch_site_id,
d.tenant_id,
d.start_date,
MIN(d.start_date) OVER (PARTITION BY tenant_id) as first_campaign_date,
d.lead_date,
d.visitors,
CASE WHEN d.sumvis >=100 AND d.sumvis IS NOT NULL THEN d.start_date
ELSE NULL
END
AS visit100_date,
d.views,
d.cta_submits,
d.unique_cta_submits,
d.cta_clicks,
d.leads,
d.clicks,
d.total_spend,
d.impressions,
d.pitch_sites_count
FROM (
SELECT
a.pitch_site_id,
a.tenant_id,
a.start_date,
a.lead_date,
a.visitors,
sum(a.visitors) OVER (PARTITION BY a.pitch_site_id ORDER BY a.start_date ROWS UNBOUNDED PRECEDING) as sumvis,
a.views,
a.cta_submits,
a.unique_cta_submits,
a.cta_clicks,
a.leads,
a.clicks,
a.total_spend,
a.impressions,
a.pitch_sites_count
FROM (
SELECT
z.engagement_id,
z.ad_id,
z.provider_ad_id_all,
COALESCE(z.engagement_pitch_site_id, h.pitch_site_id) AS pitch_site_id,
COALESCE(g.tenant_id, z.tenant_id, p.tenant_id) as tenant_id,
z.start_date,
CASE WHEN z.cta_submits > 0 AND z.cta_submits IS NOT NULL THEN z.start_date
ELSE NULL
END
AS lead_date,
z.visitors,
z.views,
z.cta_submits,
z.unique_cta_submits,
z.cta_clicks,
z.leads,
z.clicks,
z.total_spend,
z.impressions,
hh.pitch_sites_count
FROM (
SELECT
x.id as engagement_id,
y.id as ad_id,
x.pitch_site_id as engagement_pitch_site_id,
CASE WHEN x.provider_ad_id IS NOT NULL THEN x.provider_ad_id
ELSE y.provider_ad_id
END
AS provider_ad_id_all,
CASE WHEN x.start_date IS NOT NULL then x.start_date
ELSE y.start_date
END
as start_date,
y.tenant_id,
x.visitors,
x.views,
x.cta_submits,
x.unique_cta_submits,
x.cta_clicks,
x.leads,
y.clicks,
y.total_spend,
y.impressions
FROM (
SELECT
*
FROM
public_schema.provider_engagement_stats
) as x
FULL OUTER JOIN
public_schema.provider_ad_stats y
ON
x.provider_ad_id = y.provider_ad_id AND
x.start_date = y.start_date
) as z
LEFT OUTER JOIN
public_schema.pitch_sites g
ON
z.engagement_pitch_site_id = g.id
LEFT OUTER JOIN
public_schema.provider_ads p
ON
z.provider_ad_id_all = p.id
LEFT OUTER JOIN
public_schema.pitch_sites gg
ON
p.pitch_site_id = gg.id
LEFT OUTER JOIN
public_schema.hubs hh
ON
gg.public_url = hh.public_url and z.engagement_pitch_site_id is null
LEFT OUTER JOIN
public_schema.pitch_site_hubs h
ON
hh.id = h.hub_id
) as a
) as d
) as b
GROUP BY
b.pitch_site_id, b.tenant_id ;;
}
dimension: pitch_sites_count {
sql: CASE
WHEN ${TABLE}.total_spots IS NULL THEN 1
ELSE ${TABLE}.total_spots
END ;;
}
dimension: pitch_site_id {
type: int
sql: ${TABLE}.pitch_site_id ;;
}
dimension: tenant_id {
type: int
sql: ${TABLE}.tenant_id ;;
}
dimension: lead_time {
type: number
sql: DATEDIFF(hours, ${TABLE}.first_start_date, ${TABLE}.first_lead_date) ;;
}
dimension: vis100_time {
type: number
sql: DATEDIFF(hours, ${TABLE}.first_start_date, ${TABLE}.first_vis100_date) ;;
}
dimension: message_leads {
type: int
sql: CASE
WHEN ${spot_message_leads.message_leads} IS NULL THEN 0
ELSE ${spot_message_leads.message_leads}
END ;;
}
dimension: leads_without_messages {
type: int
hidden: yes
sql: ${TABLE}.unique_cta_submits ;;
}
dimension: leads {
type: int
sql: CASE
WHEN ${TABLE}.unique_cta_submits IS NULL THEN ${message_leads}
ELSE ${TABLE}.unique_cta_submits + ${message_leads}
END ;;
}
dimension: template {
sql: CASE
WHEN ${pitch_sites.template} = 'wide column' OR ${pitch_sites.template} = 'introduction' THEN 'wide column'
ELSE ${pitch_sites.template}
END ;;
}
dimension: visitors {
type: int
hidden: yes
sql: ${TABLE}.visitors ;;
}
dimension: views {
type: int
hidden: yes
sql: ${TABLE}.views ;;
}
dimension: clicks {
type: int
hidden: yes
sql: ${TABLE}.clicks/${pitch_sites_count} ;;
}
dimension: impressions {
type: int
hidden: yes
sql: ${TABLE}.impressions/${pitch_sites_count} ;;
}
dimension: total_spend {
type: int
hidden: yes
sql: ${TABLE}.total_spend/${pitch_sites_count}/100 ;;
}
dimension: cta_clicks {
type: int
hidden: yes
sql: ${TABLE}.cta_clicks ;;
}
dimension: manager {
sql: COALESCE(${_account.manager}, ${people2.display_name}) ;;
}
dimension: operations_lead {
sql: COALESCE(${_account.operations_lead}, ${people3.display_name}) ;;
}
dimension_group: first_start {
label: "Spot First Ad"
type: time
timeframes: [date, week, month]
convert_tz: no
sql: ${TABLE}.first_start_date ;;
}
dimension_group: campaign_first {
label: "Campaign First Ad"
type: time
timeframes: [date, week, month]
convert_tz: no
sql: ${TABLE}.campaign_first_date ;;
}
dimension_group: first_lead {
type: time
timeframes: [date, week, month]
convert_tz: no
sql: ${TABLE}.first_lead_date ;;
}
dimension_group: first_vis100 {
type: time
timeframes: [date, week, month]
convert_tz: no
sql: ${TABLE}.first_vis100_date ;;
}
measure: first_lead_days {
type: average
drill_fields: [detail*]
sql: ${lead_time}/24 ;;
}
measure: first_vis100_days {
type: average
drill_fields: [detail*]
sql: ${vis100_time}/24 ;;
}
measure: total_visitors {
type: sum
drill_fields: [detail*]
sql: ${TABLE}.visitors ;;
}
measure: total_views {
type: sum
drill_fields: [detail*]
sql: ${TABLE}.views ;;
}
measure: total_clicks {
type: sum
drill_fields: [detail*]
sql: ${TABLE}.clicks/${pitch_sites_count} ;;
}
measure: total_impressions {
type: sum
drill_fields: [detail*]
sql: ${impressions} ;;
}
measure: sum_total_spend {
label: "Total Spend"
type: sum
value_format: "$#,##0.00"
drill_fields: [detail*]
sql: (1.00)*${TABLE}.total_spend/${pitch_sites_count}/100 ;;
}
measure: total_non_redirect_leads {
type: sum
hidden: yes
drill_fields: [detail*]
sql: ${TABLE}.leads ;;
}
measure: total_cta_clicks {
type: sum
drill_fields: [detail*]
sql: CASE
WHEN ${TABLE}.cta_clicks > 0 THEN ${TABLE}.cta_clicks
ELSE 0
END ;;
}
measure: total_leads {
type: sum
drill_fields: [detail*]
sql: ${leads} ;;
}
measure: total_message_leads {
type: sum
drill_fields: [detail*]
sql: ${message_leads} ;;
}
measure: avg_visitors {
type: average
drill_fields: [detail*]
sql: 1.00*${TABLE}.visitors ;;
}
measure: avg_views {
type: average
drill_fields: [detail*]
sql: 1.00*${TABLE}.views ;;
}
measure: avg_clicks {
type: average
drill_fields: [detail*]
sql: 1.00*${TABLE}.clicks/${pitch_sites_count} ;;
}
measure: avg_impressions {
type: average
drill_fields: [detail*]
sql: 1.00*${TABLE}.impressions/${pitch_sites_count} ;;
}
measure: avg_total_spend {
type: average
value_format: "$#,##0.00"
drill_fields: [detail*]
sql: (1.00)*${TABLE}.total_spend/${pitch_sites_count}/100 ;;
}
measure: avg_non_redirect_leads {
type: average
hidden: yes
drill_fields: [detail*]
sql: 1.00*${TABLE}.leads ;;
}
measure: avg_cta_clicks {
type: average
drill_fields: [detail*]
sql: CASE
WHEN ${TABLE}.cta_clicks > 0 THEN 1.00*${TABLE}.cta_clicks
ELSE 0
END ;;
}
measure: avg_leads {
type: average
drill_fields: [detail*]
sql: 1.00*${leads} ;;
}
measure: avg_message_leads {
type: average
drill_fields: [detail*]
sql: 1.00*${message_leads} ;;
}
measure: pct_message_leads {
type: number
value_format: "#.00%"
drill_fields: [detail*]
sql: 1.00*${total_message_leads}/NULLIF(${total_leads},0) ;;
}
measure: ctr {
type: number
value_format: "#.00%"
drill_fields: [detail*]
sql: 1.00*${spot_campaign_stats_rollup.total_clicks}/NULLIF(${spot_campaign_stats_rollup.total_impressions},0) ;;
}
measure: cpc {
type: number
value_format: "$#,##0.00"
drill_fields: [detail*]
sql: 1.00*${spot_campaign_stats_rollup.sum_total_spend}/NULLIF(${spot_campaign_stats_rollup.total_clicks},0) ;;
}
measure: percent_cta_clicks {
type: number
value_format: "#.00%"
drill_fields: [detail*]
sql: 1.00*${spot_campaign_stats_rollup.total_cta_clicks}/NULLIF(${spot_campaign_stats_rollup.total_views},0) ;;
}
measure: percent_submit {
type: number
value_format: "#.00%"
drill_fields: [detail*]
sql: 1.00*${spot_campaign_stats_rollup.total_leads}/NULLIF(${spot_campaign_stats_rollup.total_cta_clicks},0) ;;
}
measure: cpl {
type: number
value_format: "$#,##0.00"
drill_fields: [detail*]
sql: 1.00*${spot_campaign_stats_rollup.sum_total_spend}/NULLIF(${spot_campaign_stats_rollup.total_leads},0) ;;
}
measure: conversion_rate {
type: number
value_format: "#.00%"
drill_fields: [detail*]
sql: 1.00*${spot_campaign_stats_rollup.total_leads}/NULLIF(${spot_campaign_stats_rollup.total_visitors},0) ;;
}
measure: count {
type: count
drill_fields: [detail*]
}
}
spot_campaign_stats_rollup.view.lookml · 393 lines
source-preserved
- view: spot_campaign_stats_rollup
derived_table:
sql: SELECT
b.pitch_site_id as pitch_site_id,
b.tenant_id as tenant_id,
MIN(b.start_date) as first_start_date,
MIN(b.lead_date) as first_lead_date,
MIN(b.visit100_date) as first_vis100_date,
MIN(b.first_campaign_date) as campaign_first_date,
sum(b.visitors) as visitors,
sum(b.views) as views,
sum(b.cta_submits) as cta_submits,
sum(b.unique_cta_submits) as unique_cta_submits,
sum(b.cta_clicks) as cta_clicks,
sum(b.leads) as leads,
sum(b.clicks) as clicks,
sum(b.total_spend) as total_spend,
sum(b.impressions) as impressions,
min(b.pitch_sites_count) as total_spots
FROM (
SELECT
d.pitch_site_id,
d.tenant_id,
d.start_date,
MIN(d.start_date) OVER (PARTITION BY tenant_id) as first_campaign_date,
d.lead_date,
d.visitors,
CASE WHEN d.sumvis >=100 AND d.sumvis IS NOT NULL THEN d.start_date
ELSE NULL
END
AS visit100_date,
d.views,
d.cta_submits,
d.unique_cta_submits,
d.cta_clicks,
d.leads,
d.clicks,
d.total_spend,
d.impressions,
d.pitch_sites_count
FROM (
SELECT
a.pitch_site_id,
a.tenant_id,
a.start_date,
a.lead_date,
a.visitors,
sum(a.visitors) OVER (PARTITION BY a.pitch_site_id ORDER BY a.start_date ROWS UNBOUNDED PRECEDING) as sumvis,
a.views,
a.cta_submits,
a.unique_cta_submits,
a.cta_clicks,
a.leads,
a.clicks,
a.total_spend,
a.impressions,
a.pitch_sites_count
FROM (
SELECT
z.engagement_id,
z.ad_id,
z.provider_ad_id_all,
COALESCE(z.engagement_pitch_site_id, h.pitch_site_id) AS pitch_site_id,
COALESCE(g.tenant_id, z.tenant_id, p.tenant_id) as tenant_id,
z.start_date,
CASE WHEN z.cta_submits > 0 AND z.cta_submits IS NOT NULL THEN z.start_date
ELSE NULL
END
AS lead_date,
z.visitors,
z.views,
z.cta_submits,
z.unique_cta_submits,
z.cta_clicks,
z.leads,
z.clicks,
z.total_spend,
z.impressions,
hh.pitch_sites_count
FROM (
SELECT
x.id as engagement_id,
y.id as ad_id,
x.pitch_site_id as engagement_pitch_site_id,
CASE WHEN x.provider_ad_id IS NOT NULL THEN x.provider_ad_id
ELSE y.provider_ad_id
END
AS provider_ad_id_all,
CASE WHEN x.start_date IS NOT NULL then x.start_date
ELSE y.start_date
END
as start_date,
y.tenant_id,
x.visitors,
x.views,
x.cta_submits,
x.unique_cta_submits,
x.cta_clicks,
x.leads,
y.clicks,
y.total_spend,
y.impressions
FROM (
SELECT
*
FROM
public_schema.provider_engagement_stats
) as x
FULL OUTER JOIN
public_schema.provider_ad_stats y
ON
x.provider_ad_id = y.provider_ad_id AND
x.start_date = y.start_date
) as z
LEFT OUTER JOIN
public_schema.pitch_sites g
ON
z.engagement_pitch_site_id = g.id
LEFT OUTER JOIN
public_schema.provider_ads p
ON
z.provider_ad_id_all = p.id
LEFT OUTER JOIN
public_schema.pitch_sites gg
ON
p.pitch_site_id = gg.id
LEFT OUTER JOIN
public_schema.hubs hh
ON
gg.public_url = hh.public_url and z.engagement_pitch_site_id is null
LEFT OUTER JOIN
public_schema.pitch_site_hubs h
ON
hh.id = h.hub_id
) as a
) as d
) as b
GROUP BY
b.pitch_site_id, b.tenant_id
fields:
- dimension: pitch_sites_count
sql: CASE
WHEN ${TABLE}.total_spots IS NULL THEN 1
ELSE ${TABLE}.total_spots
END
- dimension: pitch_site_id
type: int
sql: ${TABLE}.pitch_site_id
- dimension: tenant_id
type: int
sql: ${TABLE}.tenant_id
- dimension: lead_time
type: number
sql: DATEDIFF(hours, ${TABLE}.first_start_date, ${TABLE}.first_lead_date)
- dimension: vis100_time
type: number
sql: DATEDIFF(hours, ${TABLE}.first_start_date, ${TABLE}.first_vis100_date)
- dimension: message_leads
type: int
sql: CASE
WHEN ${spot_message_leads.message_leads} IS NULL THEN 0
ELSE ${spot_message_leads.message_leads}
END
- dimension: leads_without_messages
type: int
hidden: true
sql: ${TABLE}.unique_cta_submits
- dimension: leads
type: int
sql: CASE
WHEN ${TABLE}.unique_cta_submits IS NULL THEN ${message_leads}
ELSE ${TABLE}.unique_cta_submits + ${message_leads}
END
- dimension: template
sql: CASE
WHEN ${pitch_sites.template} = 'wide column' OR ${pitch_sites.template} = 'introduction' THEN 'wide column'
ELSE ${pitch_sites.template}
END
- dimension: visitors
type: int
hidden: true
sql: ${TABLE}.visitors
- dimension: views
type: int
hidden: true
sql: ${TABLE}.views
- dimension: clicks
type: int
hidden: true
sql: ${TABLE}.clicks/${pitch_sites_count}
- dimension: impressions
type: int
hidden: true
sql: ${TABLE}.impressions/${pitch_sites_count}
- dimension: total_spend
type: int
hidden: true
sql: ${TABLE}.total_spend/${pitch_sites_count}/100
- dimension: cta_clicks
type: int
hidden: true
sql: ${TABLE}.cta_clicks
- dimension: manager
sql: COALESCE(${_account.manager}, ${people2.display_name})
- dimension: operations_lead
sql: COALESCE(${_account.operations_lead}, ${people3.display_name})
- dimension_group: first_start
type: time
timeframes:
- date
- week
- month
convert_tz: false
sql: ${TABLE}.first_start_date
- dimension_group: campaign_first
type: time
timeframes:
- date
- week
- month
convert_tz: false
sql: ${TABLE}.campaign_first_date
- dimension_group: first_lead
type: time
timeframes:
- date
- week
- month
convert_tz: false
sql: ${TABLE}.first_lead_date
- dimension_group: first_vis100
type: time
timeframes:
- date
- week
- month
convert_tz: false
sql: ${TABLE}.first_vis100_date
- measure: first_lead_days
type: average
drill_fields:
- detail*
sql: ${lead_time}/24
- measure: first_vis100_days
type: average
drill_fields:
- detail*
sql: ${vis100_time}/24
- measure: total_visitors
type: sum
drill_fields:
- detail*
sql: ${TABLE}.visitors
- measure: total_views
type: sum
drill_fields:
- detail*
sql: ${TABLE}.views
- measure: total_clicks
type: sum
drill_fields:
- detail*
sql: ${TABLE}.clicks/${pitch_sites_count}
- measure: total_impressions
type: sum
drill_fields:
- detail*
sql: ${impressions}
- measure: sum_total_spend
type: sum
label: Total Spend
value_format: '$#,##0.00'
drill_fields:
- detail*
sql: (1.00)*${TABLE}.total_spend/${pitch_sites_count}/100
- measure: total_non_redirect_leads
type: sum
drill_fields:
- detail*
sql: ${TABLE}.leads
- measure: total_cta_clicks
type: sum
drill_fields:
- detail*
sql: CASE
WHEN ${TABLE}.cta_clicks > 0 THEN ${TABLE}.cta_clicks
ELSE 0
END
- measure: total_leads
type: sum
drill_fields:
- detail*
sql: ${leads}
- measure: total_message_leads
type: sum
drill_fields:
- detail*
sql: ${message_leads}
- measure: avg_visitors
type: average
drill_fields:
- detail*
sql: 1.00*${TABLE}.visitors
- measure: avg_views
type: average
drill_fields:
- detail*
sql: 1.00*${TABLE}.views
- measure: avg_clicks
type: average
drill_fields:
- detail*
sql: 1.00*${TABLE}.clicks/${pitch_sites_count}
- measure: avg_impressions
type: average
drill_fields:
- detail*
sql: 1.00*${TABLE}.impressions/${pitch_sites_count}
- measure: avg_total_spend
type: average
value_format: '$#,##0.00'
drill_fields:
- detail*
sql: (1.00)*${TABLE}.total_spend/${pitch_sites_count}/100
- measure: avg_non_redirect_leads
type: average
drill_fields:
- detail*
sql: 1.00*${TABLE}.leads
- measure: avg_cta_clicks
type: average
drill_fields:
- detail*
sql: CASE
WHEN ${TABLE}.cta_clicks > 0 THEN 1.00*${TABLE}.cta_clicks
ELSE 0
END
- measure: avg_leads
type: average
drill_fields:
- detail*
sql: 1.00*${leads}
- measure: avg_message_leads
type: average
drill_fields:
- detail*
sql: 1.00*${message_leads}
- measure: pct_message_leads
type: number
value_format: '#.00%'
drill_fields:
- detail*
sql: 1.00*${total_message_leads}/NULLIF(${total_leads},0)
- measure: ctr
type: number
value_format: '#.00%'
drill_fields:
- detail*
sql: 1.00*${spot_campaign_stats_rollup.total_clicks}/NULLIF(${spot_campaign_stats_rollup.total_impressions},0)
- measure: cpc
type: number
value_format: '$#,##0.00'
drill_fields:
- detail*
sql: 1.00*${spot_campaign_stats_rollup.sum_total_spend}/NULLIF(${spot_campaign_stats_rollup.total_clicks},0)
- measure: percent_cta_clicks
type: number
value_format: '#.00%'
drill_fields:
- detail*
sql: 1.00*${spot_campaign_stats_rollup.total_cta_clicks}/NULLIF(${spot_campaign_stats_rollup.total_views},0)
- measure: percent_submit
type: number
value_format: '#.00%'
drill_fields:
- detail*
sql: 1.00*${spot_campaign_stats_rollup.total_leads}/NULLIF(${spot_campaign_stats_rollup.total_cta_clicks},0)
- measure: cpl
type: number
value_format: '$#,##0.00'
drill_fields:
- detail*
sql: 1.00*${spot_campaign_stats_rollup.sum_total_spend}/NULLIF(${spot_campaign_stats_rollup.total_leads},0)
- measure: conversion_rate
type: number
value_format: '#.00%'
drill_fields:
- detail*
sql: 1.00*${spot_campaign_stats_rollup.total_leads}/NULLIF(${spot_campaign_stats_rollup.total_visitors},0)
- measure: count
type: count
drill_fields:
- detail*
Contents
- spot_campaign_stats_rollup.sql
- spot_campaign_stats_rollup.sql
- spot_campaign_stats_rollup.view.lkml
- spot_campaign_stats_rollup.view.lookml