These dbt-utils macros help you easily create unique IDs and reshape your data tables. They save time and avoid errors when working with data.
dbt-utils (surrogate_key, pivot, unpivot)
-- surrogate_key
{{ dbt_utils.surrogate_key(['column1', 'column2']) }}
-- pivot
{{ dbt_utils.pivot(
relation=ref('your_table'),
column='column_to_pivot',
value='value_column',
aggregate='sum'
) }}
-- unpivot
{{ dbt_utils.unpivot(
relation=ref('your_table'),
columns=['col1', 'col2'],
unpivot_column_name='new_column_name',
unpivot_value_name='new_value_name'
) }}surrogate_key creates a unique string ID by combining columns.
pivot turns row values into columns, summarizing data.
unpivot turns columns into rows, making data longer.
user_id and order_id.{{ dbt_utils.surrogate_key(['user_id', 'order_id']) }}{{ dbt_utils.pivot(
relation=ref('sales_data'),
column='product_category',
value='sales_amount',
aggregate='sum'
) }}{{ dbt_utils.unpivot(
relation=ref('monthly_sales'),
columns=['jan', 'feb', 'mar'],
unpivot_column_name='month',
unpivot_value_name='sales'
) }}This example shows how to create a surrogate key combining user_id and product_category. Then it shows how to pivot sales by product category and unpivot monthly sales columns into rows.
with source_data as ( select * from (values (1, 'A', 100, 10, 20), (2, 'B', 200, 15, 25), (3, 'A', 150, 12, 22) ) as t(user_id, product_category, sales, jan, feb) ), -- Create surrogate key combining user_id and product_category keyed as ( select user_id, product_category, sales, {{ dbt_utils.surrogate_key(['user_id', 'product_category']) }} as surrogate_id, jan, feb from source_data ), -- Pivot product_category to columns with sum of sales pivoted as ( select * from ( select user_id, product_category, sales from keyed ) pivot ( sum(sales) for product_category in ('A' as A_sales, 'B' as B_sales) ) ), -- Unpivot jan and feb sales into month and sales columns unpivoted as ( select * from ( select user_id, jan, feb from keyed ) unpivot ( sales for month in (jan, feb) ) ) select * from keyed; -- To see pivoted and unpivoted results, replace last select with: -- select * from pivoted; -- select * from unpivoted;
The surrogate_key macro returns a string combining columns, useful for unique IDs.
Pivot and unpivot help reshape data but require careful column and value selection.
Always check your data after pivot/unpivot to ensure it matches your analysis needs.
surrogate_key creates unique IDs by combining columns.
pivot turns rows into columns to summarize data.
unpivot turns columns into rows to reshape data.
Practice
surrogate_key macro in dbt-utils?Solution
Step 1: Understand surrogate_key purpose
Thesurrogate_keymacro combines values from multiple columns to create a unique ID.Step 2: Compare with other options
Pivoting changes rows to columns, renaming columns is unrelated, and removing duplicates is different.Final Answer:
To create a unique identifier by combining multiple columns -> Option AQuick Check:
surrogate_key = unique ID creation [OK]
- Confusing surrogate_key with pivot or unpivot
- Thinking it renames columns
- Assuming it removes duplicates
pivot macro in dbt-utils?Solution
Step 1: Identify correct macro and parameters
Thepivotmacro requires a table, a column to pivot on, and a value column.Step 2: Check syntax correctness
{% set pivoted = dbt_utils.pivot(table=ref('sales'), column='month', value='revenue') %} usestable=ref('sales'),column='month', andvalue='revenue', which is correct.Final Answer:
{% set pivoted = dbt_utils.pivot(table=ref('sales'), column='month', value='revenue') %} -> Option CQuick Check:
pivot syntax = table, column, value [OK]
- Using unpivot macro instead of pivot
- Passing wrong parameter names like 'row' instead of 'column'
- Not using ref() for table argument
sales_data:
product | month | revenue -------|-------|-------- A | Jan | 100 A | Feb | 150 B | Jan | 200 B | Feb | 250What will be the output of this dbt-utils
pivot macro call?
{% set pivoted = dbt_utils.pivot(table=ref('sales_data'), column='month', value='revenue') %}Solution
Step 1: Understand pivot behavior
Pivot converts unique values in the 'month' column into new columns and fills them with 'revenue' values grouped by 'product'.Step 2: Apply to given data
For product A, Jan=100 and Feb=150; for B, Jan=200 and Feb=250. So columns are product, Jan, Feb with revenue values.Final Answer:
A table with columns: product, Jan, Feb and values filled with revenue -> Option AQuick Check:
pivot turns rows to columns = A table with columns: product, Jan, Feb and values filled with revenue [OK]
- Thinking pivot repeats original rows
- Expecting only product and revenue columns
- Assuming pivot requires explicit group_by parameter
unpivot macro call:
{% set unpivoted = dbt_utils.unpivot(table=ref('sales_summary'), columns=['Jan', 'Feb'], name='month', value='revenue') %}
But you get an error. What is the most likely cause?Solution
Step 1: Check unpivot columns parameter format
Theunpivotmacro expects thecolumnsargument as a string listing columns separated by commas, not a list.Step 2: Identify error cause
Passing a Python list causes a syntax or runtime error; it must be a string like 'Jan, Feb'.Final Answer:
The 'columns' parameter must be passed as a string with comma-separated column names -> Option DQuick Check:
unpivot columns = comma-separated string [OK]
- Passing columns as Python list instead of string
- Using wrong parameter names like 'name' instead of 'column_name'
- Ignoring table reference format
employee_sales with columns: employee_id, region, Jan, Feb, Mar. You want to create a unique surrogate key combining employee_id and region, then unpivot the monthly sales columns into rows with columns month and sales. Which dbt-utils macros and steps should you use?Solution
Step 1: Create unique surrogate key
Usesurrogate_keyonemployee_idandregionto get a unique ID per employee-region.Step 2: Unpivot monthly sales columns
Applyunpivotmacro withcolumns='Jan, Feb, Mar',name='month', andvalue='sales'to convert months into rows.Final Answer:
First use surrogate_key(['employee_id', 'region']) then unpivot with columns='Jan, Feb, Mar' -> Option BQuick Check:
surrogate_key then unpivot = First usesurrogate_key(['employee_id', 'region'])to create ID, thenunpivot(table=ref('employee_sales'), columns='Jan, Feb, Mar', name='month', value='sales')[OK]
- Using pivot instead of unpivot for monthly columns
- Creating surrogate_key on month and sales columns
- Concatenating month columns for surrogate_key
Ready to prove it?
Pass the test and this pattern moves unknown
