Instructions
1. Core Standards
- Naming Convention: Use
snake_casefor all measure names.- Counts: Prefix with
count_(e.g.,count_orders). - Sums: Prefix with
total_(e.g.,total_revenue). - Averages: Prefix with
avg_(e.g.,avg_order_value). - Ratios: Use descriptive names (e.g.,
orders_per_user).
- Counts: Prefix with
- Required Parameters:
type:count,sum,average,count_distinct,number,min,max.drill_fields: Required for all non-extended measures.- Must be a defined set (preferred) or a specific list of fields.
- Define the set in the same view file or a dedicated sets file.
description: Required. Explain the calculation logic.
- Formatting:
- Use
value_format_name(e.g.,usd_0,percent_1) instead of SQL formatting where possible.
- Use
2. Common Types
- count: Counts rows. Does NOT need a
sqlparam (defaults toCOUNT(*)). - count_distinct: Counts unique values. Requires
sqlparam. - sum: Sums a numeric field. Requires
sql. - average: Averages a numeric field. Requires
sql. - number: For calculations involving other measures (e.g., margins, ratios).
Examples
Basic Measures
measure: count {
type: count
drill_fields: [order_details*]
description: "Total number of orders."
}
measure: total_revenue {
type: sum
sql: ${sale_price} ;;
value_format_name: usd
drill_fields: [order_details*]
description: "Sum of all sales prices."
}
Filtered Measure
measure: total_revenue_completed {
type: sum
sql: ${sale_price} ;;
filters: [status: "complete"]
value_format_name: usd
drill_fields: [order_details*]
description: "Total revenue from completed orders only."
}
Measure with Distinct Count
measure: count_users {
type: count_distinct
sql: ${user_id} ;;
drill_fields: [users.id, users.name, users.created_date]
description: "Number of unique users who experimented."
}