dbt
Ecommerce marketplace
User Booking Facts
User Booking Facts model for ecommerce marketplace.
inferred
Blocks
user_booking_facts.sql · 35 lines
inferred
-- models/user_booking_facts.sql
{{ config(materialized='view') }}
SELECT
"user".id AS user_id
, COUNT(*) AS lifetime_bookings
, COUNT(DISTINCT TO_CHAR(bookings_booking.create_date, 'YYYY-MM')) AS distinct_months_with_booking
, MIN(bookings_booking.create_date) AS first_booking
, MAX(bookings_booking.create_date) AS latest_booking
, DATE_PART('day', CURRENT_DATE - MAX(bookings_booking.create_date)) AS days_since_booking
, DATE_PART('day', CURRENT_DATE - MIN(bookings_booking.create_date)) AS days_since_first_booking
FROM bookings_booking
LEFT JOIN users_userprofile AS userprofile ON bookings_booking.profile_id = userprofile.id
LEFT JOIN auth_user AS "user" ON userprofile.user_id = "user".id
WHERE bookings_booking.status = 10
GROUP BY 1
# models/schema.yml
version: 2
models:
- name: user_booking_facts
columns:
- name: user_id
tests:
- unique
- not_null
- name: lifetime_bookings
- name: is_repeat_booker
- name: lifetime_bookings_tier
- name: number_of_distinct_months_with_booking
- name: days_since_last_booking
- name: days_since_first_booking
- name: months_since_first_booking
- name: days_since_first_booking_tier
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.
user_booking_facts.sql · 13 lines
source-preserved
validation: parses
SELECT
"user".id AS user_id
, COUNT(*) AS lifetime_bookings
, COUNT(DISTINCT TO_CHAR(bookings_booking.create_date, 'YYYY-MM')) AS distinct_months_with_booking
, MIN(bookings_booking.create_date) AS first_booking
, MAX(bookings_booking.create_date) AS latest_booking
, DATE_PART('day', CURRENT_DATE - MAX(bookings_booking.create_date)) AS days_since_booking
, DATE_PART('day', CURRENT_DATE - MIN(bookings_booking.create_date)) AS days_since_first_booking
FROM bookings_booking
LEFT JOIN users_userprofile AS userprofile ON bookings_booking.profile_id = userprofile.id
LEFT JOIN auth_user AS "user" ON userprofile.user_id = "user".id
WHERE bookings_booking.status = 10
GROUP BY 1
user_booking_facts.view.lkml · 80 lines
inferred
view: user_booking_facts {
derived_table: {
sql: SELECT
"user".id AS user_id
, COUNT(*) AS lifetime_bookings
, COUNT(DISTINCT TO_CHAR(bookings_booking.create_date, 'YYYY-MM')) AS distinct_months_with_booking
, MIN(bookings_booking.create_date) AS first_booking
, MAX(bookings_booking.create_date) AS latest_booking
, DATE_PART('day', CURRENT_DATE - MAX(bookings_booking.create_date)) AS days_since_booking
, DATE_PART('day', CURRENT_DATE - MIN(bookings_booking.create_date)) AS days_since_first_booking
FROM bookings_booking
LEFT JOIN users_userprofile AS userprofile ON bookings_booking.profile_id = userprofile.id
LEFT JOIN auth_user AS "user" ON userprofile.user_id = "user".id
WHERE bookings_booking.status = 10
GROUP BY 1 ;;
}
dimension: user_id {
type: int
primary_key: yes
sql: ${TABLE}.user_id ;;
}
dimension: lifetime_bookings {
type: number
sql: ${TABLE}.lifetime_bookings ;;
}
dimension: is_repeat_booker {
type: yesno
sql: ${lifetime_bookings} > 1 ;;
}
dimension: lifetime_bookings_tier {
type: tier
sql: ${lifetime_bookings} ;;
}
dimension: number_of_distinct_months_with_booking {
type: int
sql: ${TABLE}.distinct_months_with_booking ;;
}
dimension: days_since_last_booking {
type: int
sql: ${TABLE}.days_since_booking ;;
}
dimension: days_since_first_booking {
type: int
sql: ${TABLE}.days_since_first_booking ;;
}
dimension: months_since_first_booking {
type: int
sql: FLOOR(${days_since_first_booking} / 30) ;;
}
dimension: days_since_first_booking_tier {
type: tier
sql: ${days_since_first_booking} ;;
}
dimension_group: first_booking {
type: time
timeframes: [date, week, month]
sql: ${TABLE}.first_booking ;;
}
dimension_group: latest_booking {
type: time
timeframes: [date, week, month]
sql: ${TABLE}.latest_booking ;;
}
measure: average_lifetime_bookings {
type: avg
sql: ${lifetime_bookings} ;;
}
}
user_booking_facts.view.lookml · 61 lines
source-preserved
- view: user_booking_facts
derived_table:
sql: SELECT
"user".id AS user_id
, COUNT(*) AS lifetime_bookings
, COUNT(DISTINCT TO_CHAR(bookings_booking.create_date, 'YYYY-MM')) AS distinct_months_with_booking
, MIN(bookings_booking.create_date) AS first_booking
, MAX(bookings_booking.create_date) AS latest_booking
, DATE_PART('day', CURRENT_DATE - MAX(bookings_booking.create_date)) AS days_since_booking
, DATE_PART('day', CURRENT_DATE - MIN(bookings_booking.create_date)) AS days_since_first_booking
FROM bookings_booking
LEFT JOIN users_userprofile AS userprofile ON bookings_booking.profile_id = userprofile.id
LEFT JOIN auth_user AS "user" ON userprofile.user_id = "user".id
WHERE bookings_booking.status = 10
GROUP BY 1
fields:
- dimension: user_id
type: int
primary_key: true
sql: ${TABLE}.user_id
- dimension: lifetime_bookings
type: number
sql: ${TABLE}.lifetime_bookings
- dimension: is_repeat_booker
type: yesno
sql: ${lifetime_bookings} > 1
- dimension: lifetime_bookings_tier
type: tier
sql: ${lifetime_bookings}
- dimension: number_of_distinct_months_with_booking
type: int
sql: ${TABLE}.distinct_months_with_booking
- dimension: days_since_last_booking
type: int
sql: ${TABLE}.days_since_booking
- dimension: days_since_first_booking
type: int
sql: ${TABLE}.days_since_first_booking
- dimension: months_since_first_booking
type: int
sql: FLOOR(${days_since_first_booking} / 30)
- dimension: days_since_first_booking_tier
type: tier
sql: ${days_since_first_booking}
- dimension_group: first_booking
type: time
timeframes:
- date
- week
- month
sql: ${TABLE}.first_booking
- dimension_group: latest_booking
type: time
timeframes:
- date
- week
- month
sql: ${TABLE}.latest_booking
- measure: average_lifetime_bookings
type: avg
sql: ${lifetime_bookings}
Contents
- user_booking_facts.sql
- user_booking_facts.sql
- user_booking_facts.view.lkml
- user_booking_facts.view.lookml