Unity Catalog metric views: define, create, query, and manage governed business metrics in YAML. Use when building standardized KPIs, revenue metrics, order analytics, or any reusable business metrics that need consistent definitions across teams and tools.
npx skills add https://github.com/databricks/databricks-agent-skills --skill databricks-metric-views
Define reusable, governed business metrics in YAML that separate measure definitions from dimension groupings for flexible querying.
Use this skill when:
synonyms / display_name / format)CAN USE permissionsSELECT on source tables, CREATE TABLE + USE SCHEMA in the target schemaBefore authoring a metric view, inspect the source tables. Use discover-schema as the default — one call returns columns, types, sample rows, null counts, and row count. If you only know the schema, list tables first with query "SHOW TABLES IN ...".
databricks experimental aitools tools discover-schema catalog.schema.orders catalog.schema.customers
For dimensions and measures, probe distribution beyond sampling — cardinality of candidate dimensions, min/max/percentiles for measures, top categorical values. Write aggregate SQL through databricks experimental aitools tools query --warehouse <WH> "...". Both commands auto-pick the default warehouse; set DATABRICKS_WAREHOUSE_ID or pass --warehouse <ID> to override.
> The databricks experimental aitools tools subcommands are experimental — subject to change between CLI versions. Confirm availability with databricks experimental aitools tools --help before relying on them; see CLI Execution for the stable Statement Execution API fallback.
CREATE OR REPLACE VIEW catalog.schema.orders_metrics
WITH METRICS
LANGUAGE YAML
AS $$
version: 1.1
source: catalog.schema.orders
comment: "Orders KPIs for sales analysis"
filter: order_date > '2020-01-01'
dimensions:
- name: Order Month
expr: DATE_TRUNC('MONTH', order_date)
comment: "Month of order"
- name: Order Status
expr: CASE
WHEN status = 'O' THEN 'Open'
WHEN status = 'P' THEN 'Processing'
WHEN status = 'F' THEN 'Fulfilled'
END
comment: "Human-readable order status"
measures:
- name: Order Count
expr: COUNT(1)
- name: Total Revenue
expr: SUM(total_price)
comment: "Sum of total price"
- name: Revenue per Customer
expr: SUM(total_price) / COUNT(DISTINCT customer_id)
comment: "Average revenue per unique customer"
$$
All measures must use the MEASURE() function. SELECT * is NOT supported.
SELECT
`Order Month`,
`Order Status`,
MEASURE(`Total Revenue`) AS total_revenue,
MEASURE(`Order Count`) AS order_count
FROM catalog.schema.orders_metrics
WHERE extract(year FROM `Order Month`) = 2024
GROUP BY ALL
ORDER BY ALL
| Topic | File | Description |
|-------|------|-------------|
| YAML Syntax | references/yaml-reference.md | Complete YAML spec: dimensions, measures, joins, materialization |
| Patterns & Examples | references/patterns.md | Common patterns: star schema, snowflake, filtered measures, window measures, ratios |
| Multi-source build (Advisor) | references/metric-view-advisor.md | Guided workflow to build metric views from gold schemas, dashboards, SQL queries, Genie spaces, or KPI files — analysis, overlap detection, deploy |
For the single-table create/query patterns above, use this skill directly. When the user wants to build metric views from existing assets — gold/fact schemas, AI/BI dashboards, SQL query files, Genie spaces, or KPI spreadsheets — combine multiple sources, deduplicate against views that already exist, and walk deployment end to end, use the Metric View Advisor in references/metric-view-advisor.md. It builds on this skill's baseline spec and adds the multi-source analysis, overlap detection, and an interactive build/deploy flow. Load it when the user asks to "formalize our KPIs," "build a metric/semantic layer from our tables/dashboards/queries," or otherwise wants a guided build rather than authoring one view by hand.
CREATE OR REPLACE VIEW catalog.schema.orders_metrics
WITH METRICS
LANGUAGE YAML
AS $$
version: 1.1
comment: "Orders KPIs for sales analysis"
source: catalog.schema.orders
filter: order_date > '2020-01-01'
dimensions:
- name: Order Month
expr: DATE_TRUNC('MONTH', order_date)
comment: "Month of order"
- name: Order Status
expr: status
measures:
- name: Order Count
expr: COUNT(1)
- name: Total Revenue
expr: SUM(total_price)
comment: "Sum of total price"
$$;
SELECT
`Order Month`,
MEASURE(`Total Revenue`) AS total_revenue,
MEASURE(`Order Count`) AS order_count
FROM catalog.schema.orders_metrics
WHERE extract(year FROM `Order Month`) = 2024
GROUP BY ALL
ORDER BY ALL
LIMIT 100;
DESCRIBE TABLE EXTENDED catalog.schema.orders_metrics;
-- Or get YAML definition
SHOW CREATE TABLE catalog.schema.orders_metrics;
GRANT SELECT ON VIEW catalog.schema.orders_metrics TO `data-consumers`;
DROP VIEW IF EXISTS catalog.schema.orders_metrics;
> The databricks experimental aitools tools commands are experimental and their surface can change between CLI versions. Before relying on a subcommand (query, statement submit/get, discover-schema, get-default-warehouse), confirm it exists with databricks experimental aitools tools --help, and fall back to the stable Statement Execution API below if it isn't available. There is no stable databricks sql execute / execute-statement verb.
For short statements (SHOW/DESCRIBE/SELECT), run the SQL inline:
databricks experimental aitools tools query --warehouse WAREHOUSE_ID "SHOW TABLES IN catalog.schema"
For long DDL (CREATE OR REPLACE VIEW ... WITH METRICS LANGUAGE YAML AS $$...$$), write the SQL to a .sql file and submit the file — this avoids the $$-heredoc escaping traps (bash variable expansion, sed, JSON encoding) entirely:
# orders_metrics.sql holds the full CREATE OR REPLACE VIEW ... $$ ... $$ statement
databricks experimental aitools tools statement submit --file orders_metrics.sql --warehouse WAREHOUSE_ID
databricks experimental aitools tools statement get <statement_id> # blocks until terminal
This is the same file-based path the Metric View Advisor uses for deployment — keep to one method so the two don't drift.
If the experimental aitools commands aren't available, use the stable Statement Execution REST API, which takes the SQL as a JSON string:
databricks api post /api/2.0/sql/statements/execute --json '{
"warehouse_id": "WAREHOUSE_ID",
"statement": "CREATE OR REPLACE VIEW catalog.schema.orders_metrics WITH METRICS LANGUAGE YAML AS $$\nversion: 1.1\nsource: catalog.schema.orders\ndimensions:\n - name: Order Month\n expr: DATE_TRUNC(MONTH, order_date)\nmeasures:\n - name: Total Revenue\n expr: SUM(total_price)\n$$"
}'
For long statements, template the JSON from a .sql file rather than hand-escaping newlines.
To migrate a regular view to a metric view, treat its SELECT source as the metric view's source, then promote GROUP BY columns to dimensions and aggregations to measures. The new metric view does not replace the original — it sits alongside it as a governed metric layer.
-- Existing regular view (keep as-is or drop later)
-- CREATE VIEW catalog.schema.orders_summary AS
-- SELECT DATE_TRUNC('MONTH', order_date) AS month,
-- SUM(total_price) AS revenue,
-- COUNT(*) AS order_count
-- FROM catalog.schema.orders
-- GROUP BY 1;
-- Equivalent metric view (new artifact, governed)
CREATE OR REPLACE VIEW catalog.schema.orders_metrics
WITH METRICS
LANGUAGE YAML
AS $$
version: 1.1
source: catalog.schema.orders
dimensions:
- name: Order Month
expr: DATE_TRUNC('MONTH', order_date)
measures:
- name: Revenue
expr: SUM(total_price)
- name: Order Count
expr: COUNT(1)
$$
After verifying parity (SELECT ... FROM <orders_metrics> returns the same numbers as the original view), update downstream consumers and drop the original view.
version: 1.1 # Required: "1.1" for DBR 17.2+ (semantic metadata needs 17.3+)
source: catalog.schema.table # Required: source table/view
comment: "Description" # Optional: metric view description
filter: column > value # Optional: global WHERE filter
dimensions: # Required: at least one
- name: Display Name # Backtick-quoted in queries
expr: sql_expression # Column ref or SQL transformation
comment: "Description" # Optional (v1.1+)
measures: # Required: at least one
- name: Display Name # Queried via MEASURE(`name`)
expr: AGG_FUNC(column) # Must be an aggregate expression
comment: "Description" # Optional (v1.1+)
joins: # Optional: star/snowflake schema
- name: dim_table
source: catalog.schema.dim_table
on: source.fk = dim_table.pk
materialization: # Optional (experimental)
schedule: every 6 hours
mode: relaxed
| | Dimensions | Measures |
|---|---|---|
| Purpose | Categorize and group data | Aggregate numeric values |
| Examples | Region, Date, Status | SUM(revenue), COUNT(orders) |
| In queries | Used in SELECT and GROUP BY | Wrapped in MEASURE() |
| SQL expressions | Any SQL expression | Must use aggregate functions |
| Feature | Standard Views | Metric Views |
|---------|---------------|--------------|
| Aggregation locked at creation | Yes | No - flexible at query time |
| Safe re-aggregation of ratios | No | Yes |
| Star/snowflake schema joins | Manual | Declarative in YAML |
| Materialization | Separate MV needed | Built-in |
| AI/BI Genie integration | Limited | Native |
| Issue | Solution |
|-------|----------|
| SELECT * not supported | Must explicitly list dimensions and use MEASURE() for measures |
| "Cannot resolve column" | Dimension/measure names with spaces need backtick quoting |
| JOIN at query time fails | Joins must be in the YAML definition, not in the SELECT query |
| MEASURE() required | All measure references must be wrapped: MEASURE(\name\) |
| DBR version error | Requires Runtime 17.2+ for YAML v1.1, or 16.4+ for v0.1. Semantic metadata (synonyms/display_name/format) needs 17.3+ |
| Materialization not working | Requires serverless compute enabled; currently experimental |
Metric views work natively with:
Comprehensive spreadsheet creation, editing, and analysis with support for formulas, formatting, data analysis, and visualization. When Claude needs to work with spreadsheets (.xlsx, .xlsm, .csv, .tsv, etc) for: (1) Creating new spreadsheets with formulas and formatting, (2) Reading or analyzing data, (3) Modify existing spreadsheets while preserving formulas, (4) Data analysis and visualization in spreadsheets, or (5) Recalculating formulas
Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved.
Picks random winners from lists, spreadsheets, or Google Sheets for giveaways, raffles, and contests. Ensures fair, unbiased selection with transparency.
Query openFDA API for drugs, devices, adverse events, recalls, regulatory submissions (510k, PMA), substance identification (UNII), for FDA regulatory data analysis and safety research.
MATLAB and GNU Octave numerical computing for matrix operations, data analysis, visualization, and scientific computing. Use when writing MATLAB/Octave scripts for linear algebra, signal processing, image processing, differential equations, optimization, statistics, or creating scientific visualizations. Also use when the user needs help with MATLAB syntax, functions, or wants to convert between MATLAB and Python code. Scripts can be executed with MATLAB or the open-source GNU Octave interpreter.
UMAP dimensionality reduction. Fast nonlinear manifold learning for 2D/3D visualization, clustering preprocessing (HDBSCAN), supervised/parametric UMAP, for high-dimensional data.
Creating interactive data visualisations using d3.js. This skill should be used when creating custom charts, graphs, network diagrams, geographic visualisations, or any complex SVG-based data visualisation that requires fine-grained control over visual elements, transitions, or interactions. Use this for bespoke visualisations beyond standard charting libraries, whether in React, Vue, Svelte, vanilla JavaScript, or any other environment.
Access AlphaFold 200M+ AI-predicted protein structures. Retrieve structures by UniProt ID, download PDB/mmCIF files, analyze confidence metrics (pLDDT, PAE), for drug discovery and structural biology.
Take databricks/databricks-metric-views from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.