Bird
Raised Fist0
dbtdata~20 mins

Creating your first model in dbt - Practice Exercises

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 Model Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
What is the output of this dbt model SQL?
Given the following dbt model SQL, what will be the resulting table's row count if the source table has 100 rows with 20 rows having NULL in the column status?
dbt
select * from {{ source('raw_data', 'orders') }} where status is not null
A0 rows
B100 rows
C20 rows
D80 rows
Attempts:
2 left
💡 Hint
Think about how the WHERE clause filters rows with NULL status.
data_output
intermediate
2:00remaining
What columns will the model output have?
Consider this dbt model SQL that selects specific columns from a source table. What columns will the resulting model table contain?
dbt
select order_id, customer_id, order_date from {{ source('raw_data', 'orders') }}
AAll columns from orders table
Border_id, customer_id, order_date
COnly order_id
Dorder_id, customer_id, order_date, status
Attempts:
2 left
💡 Hint
Look at the SELECT statement columns.
🔧 Debug
advanced
2:00remaining
Why does this dbt model fail to compile?
This dbt model SQL throws a compilation error. What is the cause?
dbt
select * from {{ source('raw_data', orders) }}
AMissing quotes around the table name 'orders' in the source function
BMissing schema name in the source function
CUsing * is not allowed in dbt models
DThe source function requires three arguments
Attempts:
2 left
💡 Hint
Check the syntax of the source function arguments.
🚀 Application
advanced
2:30remaining
How to create a model that aggregates total sales per customer?
You want to create a dbt model that shows total sales amount per customer from the orders source table with columns customer_id and amount. Which SQL snippet correctly achieves this?
Aselect customer_id, amount from {{ source('raw_data', 'orders') }} group by customer_id
Bselect customer_id, sum(amount) from {{ source('raw_data', 'orders') }}
Cselect customer_id, sum(amount) as total_sales from {{ source('raw_data', 'orders') }} group by customer_id
Dselect customer_id, total(amount) as total_sales from {{ source('raw_data', 'orders') }} group by customer_id
Attempts:
2 left
💡 Hint
Remember to use GROUP BY when aggregating and alias the sum.
🧠 Conceptual
expert
2:00remaining
What is the main benefit of using dbt models for data transformation?
Choose the best explanation for why dbt models are useful in data projects.
AThey allow version-controlled, modular SQL transformations that build a clear data pipeline
BThey automatically clean data without writing any SQL code
CThey replace the need for any database or data warehouse
DThey provide a graphical interface to drag and drop data transformations
Attempts:
2 left
💡 Hint
Think about how dbt helps organize and manage SQL code.

Practice

(1/5)
1. What is the main purpose of a dbt model?
easy
A. To write Python scripts for data analysis
B. To store raw data without changes
C. To create visual dashboards
D. To transform raw data into clean, usable tables

Solution

  1. Step 1: Understand the role of dbt models

    dbt models are SQL files that transform raw data into clean tables for analysis.
  2. Step 2: Compare options with this role

    Only To transform raw data into clean, usable tables describes transforming raw data into clean tables, which matches the purpose of dbt models.
  3. Final Answer:

    To transform raw data into clean, usable tables -> Option D
  4. Quick Check:

    dbt model purpose = transform raw data [OK]
Hint: Remember: dbt models clean and transform data [OK]
Common Mistakes:
  • Confusing models with dashboards
  • Thinking models store raw data unchanged
  • Assuming models are Python scripts
2. Which of the following is the correct way to define a simple dbt model SQL file?
easy
A. SELECT * FROM raw_data
B. CREATE MODEL my_model AS SELECT * FROM raw_data
C. dbt run SELECT * FROM raw_data
D. INSERT INTO model SELECT * FROM raw_data

Solution

  1. Step 1: Recall dbt model syntax

    A dbt model is a SQL SELECT statement saved as a .sql file in the models folder.
  2. Step 2: Evaluate each option

    SELECT * FROM raw_data is a simple SELECT statement, which is the correct way to define a model. Options B, C, and D use incorrect syntax or commands not used in dbt model files.
  3. Final Answer:

    SELECT * FROM raw_data -> Option A
  4. Quick Check:

    dbt model = simple SELECT statement [OK]
Hint: dbt models are just SELECT queries saved as files [OK]
Common Mistakes:
  • Using CREATE MODEL syntax (not valid in dbt)
  • Trying to run dbt commands inside SQL files
  • Using INSERT statements instead of SELECT
3. Given the following dbt model SQL code saved as models/my_first_model.sql:
SELECT id, name FROM raw_customers WHERE active = true
What will be the output when you run dbt run?
medium
A. Nothing happens because dbt run does not create models
B. An error because of missing CREATE TABLE statement
C. A new table or view named my_first_model with active customers only
D. The raw_customers table will be deleted

Solution

  1. Step 1: Understand what dbt run does

    Running dbt run executes model SQL files and creates tables or views with the model name.
  2. Step 2: Analyze the model SQL

    The model selects id and name from raw_customers where active is true, so the output table will contain only active customers.
  3. Final Answer:

    A new table or view named my_first_model with active customers only -> Option C
  4. Quick Check:

    dbt run creates model tables = filtered active customers [OK]
Hint: dbt run creates tables from your SELECT queries [OK]
Common Mistakes:
  • Expecting CREATE TABLE in model SQL
  • Thinking dbt deletes source tables
  • Believing dbt run does nothing
4. You wrote this dbt model SQL file named models/customer_summary.sql:
SELECT customer_id, order_id, COUNT(*) AS orders_count
FROM orders
GROUP BY customer_id
When you run dbt run, you get an error. What is the most likely cause?
medium
A. Missing a semicolon at the end of the SQL statement
B. The GROUP BY column does not match the SELECT columns
C. The SELECT statement is missing a FROM clause
D. The model file is not saved in the models folder

Solution

  1. Step 1: Recall GROUP BY rules

    When using GROUP BY, all non-aggregated columns in SELECT must either be aggregated or included in GROUP BY.
  2. Step 2: Analyze the SELECT and GROUP BY columns

    SELECT has customer_id (in GROUP BY), order_id (neither aggregated nor grouped), COUNT(*) (aggregated). Thus, GROUP BY does not match SELECT columns.
  3. Final Answer:

    The GROUP BY column does not match the SELECT columns -> Option B
  4. Quick Check:

    GROUP BY must include all non-aggregated SELECT columns [OK]
Hint: Ensure all non-aggregated SELECT columns are in GROUP BY [OK]
Common Mistakes:
  • Forgetting to include non-aggregated columns in GROUP BY
  • Assuming semicolon is required
  • Saving model outside models folder
5. You want to create a dbt model that shows the total sales per product category, but only for categories with total sales above 1000. Which SQL code correctly implements this in your model file?
hard
A. SELECT category, SUM(sales) AS total_sales FROM sales_data GROUP BY category HAVING SUM(sales) > 1000
B. SELECT category, SUM(sales) AS total_sales FROM sales_data WHERE total_sales > 1000 GROUP BY category
C. SELECT category, SUM(sales) AS total_sales FROM sales_data GROUP BY category HAVING total_sales > 1000
D. SELECT category, SUM(sales) AS total_sales FROM sales_data WHERE SUM(sales) > 1000 GROUP BY category

Solution

  1. Step 1: Understand filtering on aggregated values

    To filter groups by aggregated values, use HAVING with the aggregate function, not WHERE.
  2. Step 2: Analyze each option

    SELECT category, SUM(sales) AS total_sales FROM sales_data GROUP BY category HAVING total_sales > 1000 uses HAVING total_sales > 1000, but total_sales is an alias and cannot be used directly in HAVING in many SQL dialects. SELECT category, SUM(sales) AS total_sales FROM sales_data GROUP BY category HAVING SUM(sales) > 1000 uses HAVING SUM(sales) > 1000, which is correct. Options B and D incorrectly use WHERE with aggregate functions, which is invalid.
  3. Final Answer:

    SELECT category, SUM(sales) AS total_sales FROM sales_data GROUP BY category HAVING SUM(sales) > 1000 -> Option A
  4. Quick Check:

    Use HAVING with aggregate functions to filter groups [OK]
Hint: Use HAVING with aggregate functions, not WHERE [OK]
Common Mistakes:
  • Using WHERE to filter aggregated results
  • Using alias names in HAVING clause
  • Forgetting GROUP BY when aggregating