Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las técnicas avanzadas para las vistas de métricas permiten expresar lógica de negocios compleja y reutilizar definiciones en la capa semántica. En esta página se explican dos técnicas de este tipo:
- Medidas de ventana: para cálculos de series temporales, como medias móviles, totales acumulados y cambios de un período a otro.
- Capacidad de composición: para crear medidas complejas haciendo referencia a otras medidas en lugar de volver a escribir su lógica.
En esta página se supone que está familiarizado con los conceptos del modelado de vistas métricas básicas. Consulte Vistas de métricas de modelo.
Note
Los ejemplos de esta página usan el conjunto de datos de ejemplo TPC-H, que modela una cadena de suministro mayorista. Para obtener más información sobre el conjunto de datos de TPC-H, consulte tpch. Para ver un tutorial de un extremo a otro mediante este conjunto de datos con vistas de métricas, consulte Tutorial: Compilación de una vista de métricas con combinaciones y modelado de datos.
Medidas de Windows
Las medidas de Windows le permiten definir medidas con agregaciones ventana, acumulativas o semiaditivas en sus vistas de métricas. Admiten cálculos como medias móviles, cambios entre períodos y totales acumulados.
Puede agregar una medida de ventana en el editor del Explorador de catálogos o en YAML.
Adición de una medida de ventana en el editor
En la pestaña UI del editor de vistas de métricas, haga clic en + Ventana mientras edita una medida. + Ventana está disponible tanto en el modo Builder como en el modo Personalizado. Las opciones de ventana del editor corresponden a los campos YAML descritos en Definir una medida de ventana.
Para obtener más información sobre cómo crear y editar medidas, consulte Creación de una vista de métricas.
Definición de una medida de ventana
Una medida de ventana incluye los siguientes campos obligatorios:
order: campo que determina la ordenación de la ventana.
range: define la extensión de la ventana. Los valores admitidos incluyen
current,cumulative,trailing,leadingyall. Para obtener una sintaxis completa y descripciones, consulte Valores admitidosrange. Para obtener más información sobre los modificadoresinclusiveyexclusivedetrailingyleading, consulte Incluir o excluir la fila de anclaje.semiaditivo: especifica cómo agregar la medida cuando el campo de orden no se incluye en la consulta.
GROUP BYValores posibles:firstylast.
Una medida de ventana también admite el siguiente campo opcional:
-
offset: desplaza el marco de ventana hacia atrás o hacia delante a lo largo del
ordercampo por un intervalo fijo. Utilícelo para medidas de variación entre períodos, como intermensual o interanual. Para ver la sintaxis, las unidades admitidas y las restricciones, consulte Medidas de ventana.
También puedes usar un parámetro entero como valor de range o offset de una medida de ventana, para que quien realiza la llamada proporcione el tamaño de la ventana en tiempo de consulta. Véase Pasar un tamaño de ventana como parámetro.
Cómo offset desplaza el marco de la ventana
Consulte Disponibilidad de características de la vista de métricas para conocer los requisitos mínimos de versión de proceso y especificación de YAML.
El campo range define la forma de la ventana en relación con la fila de anclaje, y offset desliza ese marco por el intervalo especificado a lo largo de order. La siguiente tabla muestra el marco para cada valor de range con y sin un offset de k, con respecto a la fila de anclaje t:
| rango | Marco sin desplazamiento | Marco con offset: k |
|---|---|---|
current |
[t, t] |
[t + k, t + k] |
cumulative |
(-infinity, t] |
(-infinity, t + k] |
trailing N |
[t - N, t) |
[t + k - N, t + k) |
leading N |
(t, t + N] |
(t + k, t + k + N] |
all |
partición completa | partición completa (sin cambios) |
offset es independiente de semiadditive. La elección entre first y last sigue controlando cómo se contrae la medida cuando order no está en el GROUP BY de la consulta.
Para obtener los mejores resultados, haga coincidir offset con el grano natural de order. Para los datos mensuales, se prefiere offset: -12 month a offset: -365 day porque la aritmética de meses y años respeta los meses de duración variable y los años bisiestos, mientras que la aritmética de day no lo hace.
Incluir o excluir la fila de anclaje
Consulte Disponibilidad de características de la vista de métricas para conocer los requisitos mínimos de versión de proceso y especificación de YAML.
Para los intervalos trailing y leading, la palabra clave opcional inclusive o exclusive controlan si el valor de ventana de la fila de anclaje (por ejemplo, hoy) se incluye en la ventana móvil:
| Keyword | Meaning | ¿Fila de anclaje en el rango? |
|---|---|---|
inclusive |
n unidades , incluida la fila de anclaje. | Sí |
exclusive (valor predeterminado) |
n unidades que no incluyen la fila de anclaje. | No |
En el ejemplo siguiente se muestra cómo inclusive y exclusive afectan a la ventana móvil para la fecha de anclaje 2025-01-05 con trailing 3 day.
Supongamos que los datos subyacentes tienen una fila al día con los siguientes valores:
| Date | Importancia |
|---|---|
2025-01-02 |
1 |
2025-01-03 |
4 |
2025-01-04 |
2 |
2025-01-05 (anclaje) |
5 |
Cada modificador selecciona las filas correspondientes a tres días en relación con el punto de referencia y suma sus valores:
| Modificador | Fechas en la ventana | Values | Suma |
|---|---|---|---|
trailing 3 day inclusive |
01-03, , 01-04, 01-05 |
4 + 2 + 5 |
11 |
trailing 3 day exclusive |
01-02, , 01-03, 01-04 |
1 + 4 + 2 |
7 |
leading los intervalos siguen la misma lógica en la dirección opuesta.
Ejemplo de medida de ventana retrasada, móvil o adelantada
En el ejemplo siguiente se calcula un recuento gradual de 7 días de los clientes que han realizado pedidos. Esta métrica realiza un seguimiento de las tendencias de involucración de los clientes a lo largo del tiempo mostrando cuántos clientes distintos realizaron compras en la semana que lleva a cada fecha.
version: 1.1
source: samples.tpch.orders
filter: o_orderdate > DATE'1998-01-01'
fields:
- name: date
expr: o_orderdate
measures:
- name: t7d_customers
expr: COUNT(DISTINCT o_custkey)
window:
- order: date
range: trailing 7 day
semiadditive: last
En este ejemplo, se aplica la siguiente configuración:
-
order: dateespecifica que eldatecampo ordena la ventana. -
range: trailing 7 daydefine la ventana como los 7 días anteriores a cada fecha, excepto la propia fecha. -
semiadditive: lastdevuelve el último valor de la ventana de 7 días cuandodateno es una columna de agrupación.
Creación de la vista de métricas mediante SQL
Para crear esta vista de métricas fuera del Explorador de catálogos, envuelve el YAML en CREATE OR REPLACE VIEW ... WITH METRICS LANGUAGE YAML AS y coloca la definición entre los delimitadores $$:
CREATE OR REPLACE VIEW catalog.schema.rolling_customers WITH METRICS LANGUAGE YAML AS
$$
version: 1.1
source: samples.tpch.orders
filter: o_orderdate > DATE'1998-01-01'
fields:
- name: date
expr: o_orderdate
measures:
- name: t7d_customers
expr: COUNT(DISTINCT o_custkey)
window:
- order: date
range: trailing 7 day
semiadditive: last
$$
Las otras definiciones completas de esta página siguen el mismo patrón.
Ejemplo de medida de ventana de período a período
En el ejemplo siguiente se calcula el crecimiento de las ventas diarias comparando los ingresos actuales (suma de todos los precios de pedido) con los ingresos de ayer. Esta métrica identifica las tendencias de ventas diarias y muestra el cambio porcentual en los ingresos.
version: 1.1
source: samples.tpch.orders
filter: o_orderdate > DATE'1998-01-01'
fields:
- name: date
expr: o_orderdate
measures:
- name: previous_day_sales
expr: SUM(o_totalprice)
window:
- order: date
range: trailing 1 day
semiadditive: last
- name: current_day_sales
expr: SUM(o_totalprice)
window:
- order: date
range: current
semiadditive: last
- name: day_over_day_growth
expr: (MEASURE(current_day_sales) - MEASURE(previous_day_sales)) / MEASURE(previous_day_sales) * 100
En este ejemplo, se aplica la siguiente configuración:
- En el ejemplo se usan dos medidas de ventana: una para calcular las ventas totales en el día anterior y otra para el día actual.
- Una tercera medida calcula el cambio porcentual (crecimiento) entre los días actuales y anteriores.
Ejemplo de medida de ventana interanual con offset
El modificador offset es el elemento básico para las medidas de variación entre períodos. Defina una copia desplazada de una medida base y, a continuación, componga las dos para expresar deltas, ratios o tasas de crecimiento directamente en la vista métrica.
En el ejemplo siguiente se calcula el crecimiento de ventas año a año comparando las ventas de cada mes con el mismo mes del año anterior. La medida desplazada usa offset: -12 month para mirar hacia atrás 12 meses a lo largo del campo month.
version: 1.1
source: main.default.monthly_sales
fields:
- name: month
expr: month
- name: category
expr: category
measures:
- name: monthly_sales
expr: SUM(sales)
window:
- order: month
range: current
semiadditive: last
- name: monthly_sales_py
expr: SUM(sales)
window:
- order: month
range: current
semiadditive: last
offset: -12 month
- name: yoy_growth
expr: MEASURE(monthly_sales) - MEASURE(monthly_sales_py)
- name: yoy_growth_pct
expr: (MEASURE(monthly_sales) - MEASURE(monthly_sales_py))
/ NULLIF(MEASURE(monthly_sales_py), 0)
En este ejemplo, se aplica la siguiente configuración:
-
monthly_saleses la medida base, sumando las ventas del mes actual. -
monthly_sales_pyes la misma medida desplazada 12 meses hacia atrás usandooffset: -12 month. Para enero de 2025, devuelve el valor de enero de 2024. -
yoy_growthyyoy_growth_pctcomponen las dos medidas para expresar el cambio absoluto y porcentual. El usoNULLIFde evita errores de división por cero cuando el valor del año anterior es cero.
Ejemplo de medida total acumulada (en ejecución)
En el ejemplo siguiente se calculan los ingresos acumulados de ventas desde el principio del conjunto de datos hasta cada fecha. Este total en ejecución muestra cuánto ingresos totales se han generado con el tiempo, útiles para realizar un seguimiento del progreso hacia los objetivos de ingresos anuales o analizar patrones de crecimiento a largo plazo.
version: 1.1
source: samples.tpch.orders
filter: o_orderdate > DATE'1998-01-01'
fields:
- name: date
expr: o_orderdate
- name: customer
expr: o_custkey
measures:
- name: running_total_sales
expr: SUM(o_totalprice)
window:
- order: date
range: cumulative
semiadditive: last
En este ejemplo, se aplica la siguiente configuración:
-
order: dateordena cronológicamente la ventana. -
range: cumulativedefine la ventana como el conjunto de todos los datos desde el inicio del conjunto de datos hasta cada fecha, inclusive. -
semiadditive: lastdevuelve el valor acumulado más reciente cuando no se incluyedateen elGROUP BYde la consulta, en lugar de sumar todos los valores de todas las fechas.
Ejemplo de medida de período hasta la fecha
En el ejemplo siguiente se calculan los ingresos de ventas de año a fecha (YTD). Esta medida muestra los ingresos acumulados generados desde el 1 de enero de cada año hasta la fecha actual, restableciéndose al principio de cada año nuevo.
version: 1.1
source: samples.tpch.orders
filter: o_orderdate > DATE'1997-01-01'
fields:
- name: date
expr: o_orderdate
- name: month
expr: DATE_TRUNC('MONTH', date)
- name: year
expr: DATE_TRUNC('year', date)
measures:
- name: ytd_sales
expr: SUM(o_totalprice)
window:
- order: date
range: cumulative
semiadditive: last
- order: year
range: current
semiadditive: last
En este ejemplo, se aplica la siguiente configuración:
- En el ejemplo se usan dos especificaciones de ventana: una para la suma acumulativa en el
datecampo y otra para limitar la suma alcurrentaño. - El
yearcampo restringe la suma acumulativa para que se restablezca al principio de cada año nuevo. - Los campos
monthyyearforman una jerarquía de fechas en el campodatede pedido: cada uno se define en el campodatepor su nombre, no en la columna subyacenteo_orderdate, por lo que las consultas pueden agrupar esta medida según ellos. Consulte Agrupar por un campo de jerarquía de fechas.
Ejemplo de medida semiaditiva
En el ejemplo siguiente se calculan los saldos de la cuenta, que no se deben sumar entre fechas (no se puede agregar el saldo del lunes al saldo del martes para obtener el saldo total). En su lugar, al agregar en varios días, la medida devuelve el saldo más reciente. Sin embargo, la medida se puede seguir sumando entre los clientes para mostrar el saldo total de todas las cuentas en un día determinado.
version: 1.1
fields:
- name: date
expr: date
- name: customer
expr: customer_id
measures:
- name: semiadditive_balance
expr: SUM(balance)
window:
- order: date
range: current
semiadditive: last
En este ejemplo, se aplica la siguiente configuración:
-
order: dateordena cronológicamente la ventana. -
range: currentrestringe la ventana a un solo día, sin agregación entre días. -
semiadditive: lastdevuelve el saldo más reciente cuando se agregan datos de varios días.
Note
Esta medida de ventana sigue sumando los saldos de todos los clientes para obtener el saldo total diario.
Consultar una medida de ventana
Puede consultar una vista de métricas con una medida de ventana como cualquier otra vista de métrica. Una medida de ventana se calcula a lo largo de su order campo, por lo que una consulta que divide los resultados a lo largo del tiempo debe hacer referencia a ese campo, ya sea directamente o a través de un campo de jerarquía de fechas definido en él. Cuando la consulta no hace referencia al campo order, la semiadditive palabra clave determina el valor devuelto, como se describe en el ejemplo de medida semiaditiva.
En el ejemplo siguiente se agrupa una medida de ventana por state y por una expresión de mes sobre el campo de ordenación date:
SELECT
state,
DATE_TRUNC('month', date),
MEASURE(t7d_customers) as m
FROM my_metric_view
WHERE date >= DATE'2024-06-01'
GROUP BY ALL
Agrupar por un campo de jerarquía de fechas
Una jerarquía de fechas agrega el campo de orden a niveles de granularidad más amplios, como la semana, el mes o el año. Defina cada nivel como un campo sobre el campo de pedido por nombre, no sobre la columna de origen subyacente:
fields:
- name: date
expr: o_orderdate
# Date hierarchy: each level is defined on the order field `date`,
# not on the underlying o_orderdate column.
- name: month
expr: DATE_TRUNC('MONTH', date)
- name: year
expr: DATE_TRUNC('year', date)
La agrupación de una medida de ventana por un nivel de jerarquía devuelve la medida en ese intervalo de agregación. Suponiendo que el ejemplo de período hasta la fecha se crea como ytd_metric_view, tal como se muestra en el ejemplo de medida de período hasta la fecha, la siguiente consulta devuelve el valor acumulado en el año en la última fecha de cada mes:
SELECT month, MEASURE(ytd_sales) AS ytd_sales
FROM ytd_metric_view
GROUP BY month
ORDER BY month;
Advertencia
Al definir un nivel de jerarquía en la columna de origen subyacente, como DATE_TRUNC('MONTH', o_orderdate), se interrumpe su vínculo al campo datede orden , aunque las expresiones parezcan equivalentes. La agrupación de una medida de ventana por este campo devuelve resultados incorrectos.
Capacidad de composición
Las vistas de métricas se pueden componer. Puede crear nuevos campos y medidas que hagan referencia a las existentes en lugar de volver a escribir lógica desde cero. Esto reduce la duplicación y facilita el mantenimiento de definiciones de métricas complejas.
La capacidad de composición funciona en dos niveles: dentro de una sola vista de métricas y entre distintas vistas de métricas cuando una vista de métricas se utiliza como fuente de otra.
La capacidad de composición admite los siguientes patrones de referencia:
- Campos anteriores en campos nuevos.
- Campos y medidas anteriores en nuevas medidas.
- Campos de vistas de métricas que se usan como origen en nuevos campos.
- Campos y medidas de vistas métricas utilizados como origen para nuevas medidas.
Definir medidas con capacidad de composición
En la sección measures, puede hacer referencia a medidas desde la vista de métricas de origen o las medidas definidas anteriormente en la misma vista de métricas. Este enfoque mejora la coherencia, la auditabilidad y el mantenimiento de la capa semántica.
| Tipo de medida | Description | Ejemplo |
|---|---|---|
| Atómico | Agregación sencilla y directa en una columna de origen. Estos forman los bloques fundamentales. | SUM(o_totalprice) |
| Compuesto | Expresión que combina matemáticamente una o varias medidas usando la función MEASURE(). |
MEASURE(total_revenue) / MEASURE(order_count) |
Ejemplo: Valor medio de pedido (AOV)
En el ejemplo siguiente se define el valor medio del pedido (AOV) mediante dos medidas atómicas: total_revenue (suma de precios de pedido) y order_count (número de pedidos). La avg_order_value medida hace referencia a ambas medidas atómicas.
version: 1.1
source: samples.tpch.orders
measures:
# Total Revenue
- name: total_revenue
expr: SUM(o_totalprice)
# Order Count
- name: order_count
expr: COUNT(1)
# Composed Measure: Average Order Value (AOV)
- name: avg_order_value
# Defines AOV as Total Revenue divided by Order Count
expr: MEASURE(total_revenue) / MEASURE(order_count)
Si la total_revenue definición cambia (por ejemplo, para excluir impuestos), avg_order_value usa automáticamente la definición actualizada.
Composibilidad con lógica condicional
Puede usar la capacidad de composición para crear relaciones complejas, porcentajes condicionales y tasas de crecimiento sin depender de funciones de ventana para cálculos simples de período a período.
Ejemplo: Tasa de suministro
En el ejemplo siguiente se calcula la tasa de cumplimiento: el porcentaje de pedidos con estado 'F' (cumplido). La medida divide los pedidos cumplidos por total de pedidos.
version: 1.1
source: samples.tpch.orders
measures:
# Total Orders (denominator)
- name: total_orders
expr: COUNT(1)
# Fulfilled Orders (numerator)
- name: fulfilled_orders
expr: COUNT(1) FILTER (WHERE o_orderstatus = 'F')
# Composed Measure: Fulfillment Rate (Ratio)
- name: fulfillment_rate
expr: MEASURE(fulfilled_orders) / MEASURE(total_orders)
format:
type: percentage
Procedimientos recomendados en cuanto a capacidad de composición
-
Definir primero medidas atómicas: establezca medidas fundamentales (
SUM,COUNT,AVG) antes de definir medidas que hagan referencia a ellas. -
Usar
MEASURE()para referencias: use la funciónMEASURE()al hacer referencia a otra medida en unexpr. No repita manualmente la lógica de agregación. Por ejemplo, eviteSUM(a) / COUNT(b)si ya existen medidas para ambos valores. -
Prioridad de legibilidad: componga medidas con fórmulas matemáticas claras. Por ejemplo,
MEASURE(gross_profit) / MEASURE(total_revenue)es más claro que una única expresión SQL compleja. - Agregar metadatos semánticos: use metadatos semánticos para dar formato a medidas compuestas (por ejemplo, porcentajes o moneda) para herramientas de análisis posteriores. Consulte los metadatos del agente en las vistas de métricas.