measure Fonction d’agrégation

S’applique à :case cochée Databricks SQL case cochée Databricks Runtime 16.4 et versions ultérieures

Retourne l’agrégat measure_column à partir des valeurs d’un groupe. Dans Databricks Runtime 18.1 et versions ultérieures, agg la fonction d’agrégation est un synonyme de cette fonction.

Contrairement à une fonction d’agrégation régulière telle que SUM, AVGou COUNT, la MEASURE fonction ne spécifie pas l’agrégation. Il hérite de la définition de l’agrégation de la définition de la vue des métriques.

L’utilisation d’une vue métrique avec des mesures est supérieure aux vues régulières, car elle extrait la complexité des agrégations sous-jacentes tout en donnant à l’appelant la liberté de choisir les colonnes de regroupement.

Syntaxe

measure ( measure_column ) [ FILTER ( WHERE cond ) ]

Cette fonction ne peut pas être appelée en tant que fonction de fenêtre à l’aide de la OVER clause.

Les arguments

  • measure_column : référence à une colonne de mesure dans une vue de métrique.

  • cond: expression booléenne facultative dans une clause FILTER qui filtre les lignes utilisées pour calculer la mesure.

    S’applique à :check marqué oui Databricks SQL check marqué oui Databricks Runtime 18.1 et versions ultérieures

Retours

Valeur du type de measure_column.

Comportement de clause FILTER

Lorsque vous appliquez une FILTER clause à une mesure, la condition de filtre est appliquée à chaque fonction d’agrégation dans la définition de la mesure :

  • Si une fonction d’agrégation dans la définition n’a aucune FILTER clause, la condition de la mesure est appliquée à celle-ci.
  • Si une fonction d’agrégation dans la définition a déjà une FILTER clause, la condition de la mesure est combinée à celle existante à l’aide ANDde .

Les mêmes règles s’appliquent de manière récursive lorsqu’une mesure fait référence à une autre mesure.

Pour les mesures de fenêtre, la FILTER clause est appliquée après l’agrégation de fenêtre, ce qui équivaut à placer la même condition dans la clause de WHERE la requête.

Dans les versions de Databricks Runtime inférieures à 18.1, une FILTER clause sur une mesure retourne une erreur.

Exemples

-- A metric view with a measure column 4 metric columns
CREATE OR REPLACE VIEW region_sales_metrics
  (month COMMENT 'Month order was made',
   status,
   order_priority,
   count_orders COMMENT 'Count of orders',
   total_Revenue,
   total_Revenue_p_Customer,
   total_revenue_for_open_orders)
  WITH METRICS
  LANGUAGE YAML
  COMMENT 'A metric view for regional sales metrics.'
  AS $$
   version: 0.1
   source: samples.tpch.orders
   filter: o_orderdate > '1990-01-01'
   dimensions:
   - name: month
     expr: date_trunc('MONTH', o_orderdate)
   - name: status
     expr: case
       when o_orderstatus = 'O' then 'Open'
       when o_orderstatus = 'P' then 'Processing'
       when o_orderstatus = 'F' then 'Fulfilled'
       end
   - name: order_priority
     expr: split(o_orderpriority, '-')[1]
   measures:
   - name: count_orders
     expr: count(1)
   - name: total_revenue
     expr: SUM(o_totalprice)
   - name: total_revenue_per_customer
     expr: SUM(o_totalprice) / count(distinct o_custkey)
   - name: total_revenue_for_open_orders
     expr: SUM(o_totalprice) filter (where o_orderstatus='O')
  $$;

-- Tracking total_revenue_per_customer by month in 1995
> SELECT extract(month from month) as month,
    measure(total_revenue_per_customer)::bigint AS total_revenue_per_customer
  FROM region_sales_metrics
  WHERE extract(year FROM month) = 1995
  GROUP BY ALL
  ORDER BY ALL;
  month	 total_revenue_per_customer
  -----  --------------------------
   1     167727
   2     166237
   3     167349
   4     167604
   5     166483
   6     167402
   7     167272
   8     167435
   9     166633
  10     167441
  11     167286
  12     167542

-- Tracking total_revenue_per_customer by month and status in 1995
> SELECT extract(month from month) as month,
    status,
    measure(total_revenue_per_customer)::bigint AS total_revenue_per_customer
  FROM region_sales_metrics
  WHERE extract(year FROM month) = 1995
  GROUP BY ALL
  ORDER BY ALL;
  month  status      total_revenue_per_customer
  -----  ---------   --------------------------
   1     Fulfilled   167727
   2     Fulfilled   161720
   2    Open          40203
   2    Processing   193412
   3    Fulfilled    121816
   3    Open          52424
   3    Processing   196304
   4    Fulfilled     80405
   4    Open          75630
   4    Processing   196136
   5    Fulfilled     53460
   5    Open         115344
   5    Processing   196147
   6    Fulfilled     42479
   6    Open         160390
   6    Processing   193461
   7    Open         167272
   8    Open         167435
   9    Open         166633
   10   Open         167441
   11   Open         167286
   12   Open         167542

-- Compare total revenue to revenue from fulfilled orders by month in 1995.
-- The FILTER condition is pushed down to the SUM aggregate in the total_revenue definition.
> SELECT extract(month from month) as month,
    measure(total_revenue)::bigint AS total_revenue,
    measure(total_revenue) FILTER (WHERE status = 'Fulfilled') AS fulfilled_revenue
  FROM region_sales_metrics
  WHERE extract(year FROM month) = 1995
  GROUP BY ALL
  ORDER BY ALL;