Metric definitions help you clearly describe how to measure things in your data. A semantic layer makes these definitions easy to use and understand for everyone.
Metric definitions and semantic layer in dbt
metrics:
- name: total_revenue
label: "Total Revenue"
model: ref('orders')
calculation_method: sum
expression: amount
timestamp: order_date
dimensions:
- product_category
- regionThe metrics block defines one or more metrics.
model points to the data source, calculation_method tells how to calculate, and expression is the field used.
metrics:
- name: total_orders
label: "Total Orders"
model: ref('orders')
calculation_method: count
expression: order_id
timestamp: order_datemetrics:
- name: average_order_value
label: "Average Order Value"
model: ref('orders')
calculation_method: average
expression: amount
timestamp: order_datemetrics:
- name: total_revenue_by_category
label: "Total Revenue by Category"
model: ref('orders')
calculation_method: sum
expression: amount
timestamp: order_date
dimensions:
- product_categoryThis example defines a metric for total revenue by product category. Then it shows SQL to calculate it from the orders table.
metrics:
- name: total_revenue
label: "Total Revenue"
model: ref('orders')
calculation_method: sum
expression: amount
timestamp: order_date
dimensions:
- product_category
-- Example SQL to use the metric in a dbt model
select
product_category,
sum(amount) as total_revenue
from {{ ref('orders') }}
group by product_category
order by total_revenue desc;Always use clear names and labels for metrics so everyone understands them.
Dimensions let you break down metrics by categories like region or product type.
The semantic layer helps keep metric logic in one place, avoiding mistakes in reports.
Metric definitions describe how to measure key numbers in your data.
The semantic layer makes metrics easy to find and use across your team.
Using metrics consistently helps keep reports accurate and trustworthy.
Practice
Solution
Step 1: Understand metric definitions
Metric definitions specify how to calculate important numbers like sales or counts.Step 2: Connect metric definitions to semantic layer purpose
The semantic layer uses these definitions to ensure everyone uses the same calculations, keeping reports consistent.Final Answer:
To standardize how key numbers are calculated and used across reports -> Option AQuick Check:
Metric definitions = Standard calculations [OK]
- Thinking metrics create dashboards automatically
- Confusing metrics with raw data storage
- Believing metrics speed up SQL writing
Solution
Step 1: Identify correct metric type for counting
The metric type for counting rows is 'count', not 'sum' or 'average'.Step 2: Check model reference syntax
Using ref('users') is correct to link the metric to the 'users' model.Final Answer:
metrics: - name: user_count model: ref('users') label: 'User Count' type: count -> Option CQuick Check:
Count metric uses type 'count' and ref() [OK]
- Using 'sum' or 'average' instead of 'count' for counting
- Not using ref() for model reference
- Incorrect indentation or YAML structure
metrics:
- name: total_revenue
model: ref('orders')
label: 'Total Revenue'
type: sum
sql: amountWhat will be the output of querying this metric if the 'orders' table has amounts: [100, 200, 300]?
Solution
Step 1: Understand metric type and SQL field
The metric type is 'sum' on the 'amount' field, so it adds all amounts.Step 2: Calculate sum of amounts
Sum of [100, 200, 300] = 100 + 200 + 300 = 600.Final Answer:
600 -> Option AQuick Check:
Sum amounts = 600 [OK]
- Confusing sum with count (3 rows)
- Picking a single value instead of sum
- Adding incorrectly
metrics:
- name: avg_order_value
model: ref('orders')
label: 'Average Order Value'
type: avg
sql: total_priceBut when you run your report, the average is incorrect. What is the likely error?
Solution
Step 1: Check valid metric types in dbt
dbt metric types include 'average' for average, not 'avg'.Step 2: Identify the impact of wrong type
Using 'avg' is invalid and causes incorrect calculation or errors.Final Answer:
The metric type should be 'average' instead of 'avg' -> Option BQuick Check:
Use 'average' for average metric type [OK]
- Using 'avg' instead of 'average' as metric type
- Changing model reference incorrectly
- Assuming 'sql' field name is wrong
Solution
Step 1: Understand metric composition in dbt semantic layer
Complex metrics like percentages are built by combining simpler metrics, not by writing raw SQL in one metric.Step 2: Define filtered and total counts separately
Define active_user_count with a filter for active=true, and total_user_count without filter.Step 3: Create derived metric for percentage
Use a derived metric that divides active_user_count by total_user_count to get the percentage.Final Answer:
Define two separate metrics: one for active_user_count (type: count with filter active=true) and one for total_user_count (type: count), then create a derived metric dividing active_user_count by total_user_count -> Option DQuick Check:
Build complex metrics by combining simple filtered metrics [OK]
- Trying to write raw SQL for percentage in one metric
- Using invalid metric types like 'percentage'
- Summing boolean fields without filtering
Ready to prove it?
Pass the test and this pattern moves unknown
