在 Hive 中,“WITH AS”语句也被称为公共表表达式(Common Table Expression,CTE),它可以使复杂的查询更具可读性和可维护性。

语法

WITH cte_name1 AS (subquery1),
     cte_name2 AS (subquery2),
    ...
SELECT columns
FROM cte_name1, cte_name2,...;

解释

  • cte_name:是公共表表达式的名称,可以在后续的查询中引用。
  • subquery:是一个子查询,它定义了公共表表达式的结果集。
  • SELECT 语句中,可以从一个或多个公共表表达式中选择列。

示例

假设有一个名为 orders 的表,包含 order_idcustomer_idorder_datetotal_amount 列。

  1. 计算每个客户的订单总数和总金额:
WITH customer_orders AS (
    SELECT customer_id, COUNT(*) AS order_count, SUM(total_amount) AS total_amount_sum
    FROM orders
    GROUP BY customer_id
)
SELECT customer_id, order_count, total_amount_sum
FROM customer_orders;

在这个例子中,首先定义了一个名为 customer_orders 的公共表表达式,它计算每个客户的订单总数和总金额。然后,在外部查询中,从这个公共表表达式中选择客户 ID、订单总数和总金额。

  1. 使用多个公共表表达式:
WITH total_orders AS (
    SELECT COUNT(*) AS total_order_count
    FROM orders
),
high_value_customers AS (
    SELECT customer_id
    FROM orders
    WHERE total_amount > 1000
)
SELECT total_order_count, COUNT(DISTINCT customer_id) AS high_value_customer_count
FROM total_orders, high_value_customers;

在这个例子中,定义了两个公共表表达式。total_orders 计算订单总数,high_value_customers 选择总金额大于 1000 的客户 ID。然后,在外部查询中,从这两个公共表表达式中选择订单总数和高价值客户的数量。

公共表表达式可以使复杂的查询更易于理解和维护,特别是当查询涉及多个子查询或临时结果集时。它们还可以提高查询的性能,因为 Hive 可以对公共表表达式进行优化,避免重复计算。