Instructions
1. File Organization
- Standard Views:
views/[datasource_name]/[view_name].view.lkml - Extended Views:
views/[datasource_name]/[view_name]_ext.view.lkml - Refinements:
views/[datasource_name]/[view_name]_rfn.view.lkml - NDTs:
views/[datasource_name]/[view_name]_ndt.view.lkml - SDTs:
views/[datasource_name]/[view_name]_sdt.view.lkml
2. Core Standards
- sql_table_name: Required for standard views. Defaults are fragile; be explicit.
- Primary Key:
- Must be the first dimension defined in the file.
- Must have
primary_key: yes.
- Refinements: Use
+before the view name (e.g.,view: +users) to refine existing views without modifying the original file. - Extensions: Use
extendsto reuse logic from other views.
3. Best Practices
- Naming: Use
snake_casefor view names and filenames. - Descriptions: Add descriptions to the view itself if it helps explain its purpose (e.g., "Daily active users aggregated by region").
- Output Format: Ensure the file ends with a newline.
4. Related Skills
- lookml-refinements: Logic for
include, refinements (+), and Hub & Spoke patterns.
Examples
Basic View
view: users {
sql_table_name: `project.dataset.users` ;;
dimension: user_id {
primary_key: yes
type: number
sql: ${TABLE}.id ;;
group_label: "IDs"
description: "Unique internal user ID."
}
dimension: email {
type: string
sql: ${TABLE}.email ;;
description: "User's email address."
}
}
Extended View
include: "/views/base/users.view"
view: users_extended {
extends: [users]
dimension: lifetime_value {
type: number
sql: ${TABLE}.ltv ;;
description: "Total lifetime value of the user."
}
}
Refinement (Layering)
include: "/views/users.view"
view: +users {
label: "All Users (Refined)"
dimension: email {
# Adding a description to an existing field
description: "Primary contact email."
}
}
Reference Skills
- Derived Tables: Standard (SDT) and Native (NDT) derived table patterns/materialization.