dbt
Marketing analytics
Transactions
Transactions model for marketing analytics.
inferred
Blocks
transactions.sql · 45 lines
inferred
-- models/transactions.sql
{{ config(materialized='view') }}
select * from (
SELECT
domain_userid,
domain_sessionidx,
domain_userid || '-' || domain_sessionidx AS visit_id,
tr_orderid,
tr_affiliation,
tr_total,
tr_tax,
tr_city,
tr_state,
tr_country,
collector_tstamp AS tr_tstamp,
event_id,
row_number() over (partition by domain_userid, domain_sessionidx, tr_orderid order by collector_tstamp asc) rn
FROM {{ this }}.events
WHERE event = 'transaction' ) x
where x.rn = 1
# models/schema.yml
version: 2
models:
- name: transactions
columns:
- name: event_id
- name: domain_user_id
- name: domain_session_index
- name: visit_id
- name: order_id
tests:
- unique
- not_null
- name: affiliation
- name: transaction_value
- name: tax
- name: city
- name: state
- name: country
- name: order_items
- name: transaction_apr
- name: booking_window
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.
transactions.sql · 18 lines
source-preserved
validation: not checked
select * from (
SELECT
domain_userid,
domain_sessionidx,
domain_userid || '-' || domain_sessionidx AS visit_id,
tr_orderid,
tr_affiliation,
tr_total,
tr_tax,
tr_city,
tr_state,
tr_country,
collector_tstamp AS tr_tstamp,
event_id,
row_number() over (partition by domain_userid, domain_sessionidx, tr_orderid order by collector_tstamp asc) rn
FROM ${TABLE}.events
WHERE event = 'transaction' ) x
where x.rn = 1
transactions.view.lkml · 117 lines
inferred
view: transactions {
derived_table: {
sql: select * from (
SELECT
domain_userid,
domain_sessionidx,
domain_userid || '-' || domain_sessionidx AS visit_id,
tr_orderid,
tr_affiliation,
tr_total,
tr_tax,
tr_city,
tr_state,
tr_country,
collector_tstamp AS tr_tstamp,
event_id,
row_number() over (partition by domain_userid, domain_sessionidx, tr_orderid order by collector_tstamp asc) rn
FROM ${TABLE}.events
WHERE event = 'transaction' ) x
where x.rn = 1 ;;
}
dimension: event_id {
sql: ${TABLE}.event_id ;;
}
dimension: domain_user_id {
sql: ${TABLE}.domain_userid ;;
}
dimension: domain_session_index {
type: int
sql: ${TABLE}.domain_sessionidx ;;
}
dimension: visit_id {
sql: ${TABLE}.visit_id ;;
}
dimension: order_id {
primary_key: yes
sql: ${TABLE}.tr_orderid ;;
}
dimension: affiliation {
sql: ${TABLE}.tr_affiliation ;;
}
dimension: transaction_value {
type: number
sql: ${TABLE}.tr_total ;;
}
dimension: tax {
type: number
sql: ${TABLE}.tr_tax ;;
}
dimension: city {
sql: ${TABLE}.tr_city ;;
}
dimension: state {
sql: ${TABLE}.tr_state ;;
}
dimension: country {
sql: ${TABLE}.tr_country ;;
}
dimension: order_items {
sql: ${order_id} ;;
}
dimension: transaction_apr {
type: number
sql: case when ${transaction_info.checkin_date} is not null then ${TABLE}.tr_total/(case
when ${transaction_info.checkout_date}-${transaction_info.checkin_date} > 0
then ${transaction_info.checkout_date}-${transaction_info.checkin_date} else
1 end) end ;;
}
dimension: booking_window {
type: int
sql: ((${transaction_info.checkin_date})::date - (${TABLE}.tr_tstamp)::date)::integer ;;
}
dimension_group: occurred {
type: time
timeframes: [time, date, week, month]
sql: ${TABLE}.tr_tstamp ;;
}
measure: transactions_count {
type: count_distinct
sql: ${order_id} ;;
}
measure: total_transaction_value {
type: sum
sql: ${transaction_value} ;;
}
measure: apr {
type: number
sql: sum(case when ${transaction_info.checkin_date} is not null then ${TABLE}.tr_total
else null end) / sum(case when ${transaction_info.checkin_date} is not null
then case when ${transaction_info.checkout_date}-${transaction_info.checkin_date}
> 0 then ${transaction_info.checkout_date}-${transaction_info.checkin_date}
else 1 end end) ;;
}
measure: avg_booking_window {
type: average
sql: (${transaction_info.checkin_date}::date - ${TABLE}.tr_tstamp::date)::integer ;;
}
}
transactions.view.lookml · 82 lines
source-preserved
- view: transactions
derived_table:
sql: select * from (
SELECT
domain_userid,
domain_sessionidx,
domain_userid || '-' || domain_sessionidx AS visit_id,
tr_orderid,
tr_affiliation,
tr_total,
tr_tax,
tr_city,
tr_state,
tr_country,
collector_tstamp AS tr_tstamp,
event_id,
row_number() over (partition by domain_userid, domain_sessionidx, tr_orderid order by collector_tstamp asc) rn
FROM ${TABLE}.events
WHERE event = 'transaction' ) x
where x.rn = 1
fields:
- dimension: event_id
sql: ${TABLE}.event_id
- dimension: domain_user_id
sql: ${TABLE}.domain_userid
- dimension: domain_session_index
type: int
sql: ${TABLE}.domain_sessionidx
- dimension: visit_id
sql: ${TABLE}.visit_id
- dimension: order_id
primary_key: true
sql: ${TABLE}.tr_orderid
- dimension: affiliation
sql: ${TABLE}.tr_affiliation
- dimension: transaction_value
type: number
sql: ${TABLE}.tr_total
- dimension: tax
type: number
sql: ${TABLE}.tr_tax
- dimension: city
sql: ${TABLE}.tr_city
- dimension: state
sql: ${TABLE}.tr_state
- dimension: country
sql: ${TABLE}.tr_country
- dimension: order_items
sql: ${order_id}
- dimension: transaction_apr
type: number
sql: case when ${transaction_info.checkin_date} is not null then ${TABLE}.tr_total/(case
when ${transaction_info.checkout_date}-${transaction_info.checkin_date} > 0
then ${transaction_info.checkout_date}-${transaction_info.checkin_date} else
1 end) end
- dimension: booking_window
type: int
sql: ((${transaction_info.checkin_date})::date - (${TABLE}.tr_tstamp)::date)::integer
- dimension_group: occurred
type: time
timeframes:
- time
- date
- week
- month
sql: ${TABLE}.tr_tstamp
- measure: transactions_count
type: count_distinct
sql: ${order_id}
- measure: total_transaction_value
type: sum
sql: ${transaction_value}
- measure: apr
type: number
sql: sum(case when ${transaction_info.checkin_date} is not null then ${TABLE}.tr_total
else null end) / sum(case when ${transaction_info.checkin_date} is not null
then case when ${transaction_info.checkout_date}-${transaction_info.checkin_date}
> 0 then ${transaction_info.checkout_date}-${transaction_info.checkin_date}
else 1 end end)
- measure: avg_booking_window
type: average
sql: (${transaction_info.checkin_date}::date - ${TABLE}.tr_tstamp::date)::integer
Contents
- transactions.sql
- transactions.sql
- transactions.view.lkml
- transactions.view.lookml