Bird
Raised Fist0
dbtdata~20 mins

ref() function for model dependencies in dbt - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
dbt ref() Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of ref() in a dbt model SQL
Given the following dbt model SQL code, what will be the fully qualified table name generated by the ref('customers') function if the project is deployed in the analytics schema of the prod database?
dbt
select * from {{ ref('customers') }}
A"prod"."analytics"."customers"
B"analytics"."prod"."customers"
C"prod"."customers"."analytics"
D"customers"."analytics"."prod"
Attempts:
2 left
💡 Hint
Remember that ref() resolves to the database, schema, and table name in that order.
data_output
intermediate
1:30remaining
Number of rows returned using ref() in a join
Consider two dbt models: orders and customers. Consider the following model SQL:
select o.order_id, c.customer_name
from {{ ref('orders') }} o
join {{ ref('customers') }} c on o.customer_id = c.customer_id

If orders has 100 rows and customers has 10 rows, and every order has a matching customer, how many rows will this query return?
A110
B10
C1000
D100
Attempts:
2 left
💡 Hint
Think about how a join works when every order has a matching customer.
🔧 Debug
advanced
1:30remaining
Identify the error caused by incorrect use of ref()
What error will occur when running this dbt model SQL?
select * from {{ ref(customers) }}

Note: customers is not in quotes.
ARuntime error: table not found
BCompilation error: 'customers' is not defined
CSyntax error: missing quotes around string
DNo error, runs successfully
Attempts:
2 left
💡 Hint
Look at how the argument to ref() is passed.
🧠 Conceptual
advanced
2:00remaining
Understanding model dependency graph with ref()
In dbt, if model A uses {{ ref('B') }} and model B uses {{ ref('C') }}, which models will be built before A?
AOnly model <code>B</code> will be built before <code>A</code>
BOnly model <code>C</code> will be built before <code>A</code>
CModels <code>B</code> and <code>C</code> will be built before <code>A</code>
DModels <code>A</code>, <code>B</code>, and <code>C</code> are built simultaneously
Attempts:
2 left
💡 Hint
Think about how dependencies chain in dbt models.
🚀 Application
expert
2:30remaining
Predict the effect of changing ref() argument on model build order
You have three models: sales, customers, and regions. The sales model uses {{ ref('customers') }}. You change the sales model to use {{ ref('regions') }} instead. What is the impact on the build order?
AThe <code>sales</code> model will now build after <code>regions</code> instead of <code>customers</code>
BThe build order remains the same; <code>sales</code> builds after both <code>customers</code> and <code>regions</code>
CThe <code>sales</code> model will build before both <code>customers</code> and <code>regions</code>
DThe <code>sales</code> model will build independently without waiting for any other model
Attempts:
2 left
💡 Hint
Consider how changing the ref() target changes dependencies.

Practice

(1/5)
1. What is the main purpose of the ref() function in dbt?
easy
A. To create new database users
B. To write raw SQL queries inside dbt models
C. To link models and define dependencies between them
D. To schedule dbt runs automatically

Solution

  1. Step 1: Understand the role of ref()

    The ref() function is used to link one model to another in dbt, so dbt knows the order to run models and their dependencies.
  2. Step 2: Identify what ref() does not do

    It does not write raw SQL, create users, or schedule runs. Its main role is linking models.
  3. Final Answer:

    To link models and define dependencies between them -> Option C
  4. Quick Check:

    ref() links models = A [OK]
Hint: Remember: ref() connects models, not SQL or users [OK]
Common Mistakes:
  • Thinking ref() writes SQL code
  • Confusing ref() with scheduling tools
  • Assuming ref() manages database users
2. Which of the following is the correct syntax to reference a model named customers inside another model using ref()?
easy
A. select * from {{ ref('customers') }}
B. select * from ref('customers')
C. select * from ref(customers)
D. select * from {{ ref(customers) }}

Solution

  1. Step 1: Recall dbt Jinja syntax for ref()

    In dbt, ref() must be wrapped in double curly braces and the model name must be a string in quotes.
  2. Step 2: Check each option

    select * from {{ ref('customers') }} uses {{ ref('customers') }} which is correct. Options B and C miss the curly braces or quotes. select * from {{ ref(customers) }} misses quotes around the model name.
  3. Final Answer:

    select * from {{ ref('customers') }} -> Option A
  4. Quick Check:

    Use {{ ref('model_name') }} syntax = A [OK]
Hint: Always use {{ ref('model_name') }} with quotes and braces [OK]
Common Mistakes:
  • Omitting curly braces {{ }}
  • Not putting model name in quotes
  • Using ref() without Jinja syntax
3. Given the following dbt model code, what will be the output SQL after compilation if the orders model exists?
select order_id, customer_id
from {{ ref('orders') }}
medium
A. select order_id, customer_id from orders
B. select order_id, customer_id from {{ ref('orders') }}
C. select order_id, customer_id from dbt.orders
D. select order_id, customer_id from ref('orders')

Solution

  1. Step 1: Understand what ref() compiles to

    The ref() function compiles to the actual table name of the referenced model, usually just the model name like 'orders'.
  2. Step 2: Check the compiled SQL output

    The compiled SQL replaces {{ ref('orders') }} with orders, so the output is select order_id, customer_id from orders.
  3. Final Answer:

    select order_id, customer_id from orders -> Option A
  4. Quick Check:

    ref('orders') compiles to orders = C [OK]
Hint: ref() compiles to the model's table name without braces [OK]
Common Mistakes:
  • Leaving ref() uncompiled in SQL
  • Adding extra schema prefix without config
  • Using ref() as a string literal
4. You wrote this dbt model code:
select * from ref('sales')

When you run dbt, you get an error. What is the problem?
medium
A. Quotes around 'sales' should be removed
B. Model name 'sales' does not exist
C. ref() cannot be used inside select statements
D. Missing double curly braces around ref()

Solution

  1. Step 1: Check the syntax of ref() usage

    In dbt, ref() must be wrapped in double curly braces to be interpreted as Jinja code.
  2. Step 2: Identify the error cause

    The code uses ref('sales') without {{ }}, so dbt treats it as plain text, causing an error.
  3. Final Answer:

    Missing double curly braces around ref() -> Option D
  4. Quick Check:

    Use {{ ref('model') }} not ref('model') alone = D [OK]
Hint: Always wrap ref() in {{ }} to avoid errors [OK]
Common Mistakes:
  • Forgetting {{ }} around ref()
  • Assuming ref() works without Jinja
  • Removing quotes from model name
5. You have two models: customers and orders. You want to create a new model customer_orders that joins these two. Which is the best way to use ref() to ensure correct dependencies and flexible naming?
hard
A. select c.customer_id, o.order_id from customers c join orders o on c.customer_id = o.customer_id
B. select c.customer_id, o.order_id from {{ ref('customers') }} c join {{ ref('orders') }} o on c.customer_id = o.customer_id
C. select c.customer_id, o.order_id from 'customers' c join 'orders' o on c.customer_id = o.customer_id
D. select c.customer_id, o.order_id from ref('customers') c join ref('orders') o on c.customer_id = o.customer_id

Solution

  1. Step 1: Use ref() with correct Jinja syntax for both models

    To link models and ensure dbt knows dependencies, use {{ ref('model_name') }} for both customers and orders.
  2. Step 2: Avoid hardcoding table names or missing Jinja syntax

    Options A and C hardcode names or use quotes incorrectly. select c.customer_id, o.order_id from ref('customers') c join ref('orders') o on c.customer_id = o.customer_id misses curly braces, so it won't compile.
  3. Final Answer:

    select c.customer_id, o.order_id from {{ ref('customers') }} c join {{ ref('orders') }} o on c.customer_id = o.customer_id -> Option B
  4. Quick Check:

    Use {{ ref('model') }} for all dependencies = B [OK]
Hint: Use {{ ref('model') }} for all model references [OK]
Common Mistakes:
  • Hardcoding table names instead of using ref()
  • Forgetting curly braces around ref()
  • Using quotes incorrectly around model names