Lakehouse 数据对比与合并指南(集合操作)

概述

在数据分析中,经常需要将多个查询结果进行合并、对比或找出差异。云器 Lakehouse 提供完整的集合操作支持,包括

UNION
UNION
(合并)、
INTERSECT
INTERSECT
(交集)和
EXCEPT
EXCEPT
(差集)。本指南按业务场景分类,帮助您快速掌握高效的数据对比与合并方法。

涉及的 SQL 命令

命令用途适用场景
UNION ALL
UNION ALL
合并结果集(保留重复)快速合并多个表或分区数据
UNION
UNION
合并结果集(去重)合并后需要唯一记录
INTERSECT
INTERSECT
返回两个结果集的交集查找共同用户、共同订单等
EXCEPT
EXCEPT
返回第一个结果集有但第二个没有的数据查找新增、流失、差异数据

前置准备

以下示例使用模拟的两个销售表

sales_2023
sales_2023
sales_2024
sales_2024

-- 创建 2023 年销售表 CREATE TABLE IF NOT EXISTS sales_2023 ( customer_id INT, product STRING, amount DOUBLE ); -- 创建 2024 年销售表 CREATE TABLE IF NOT EXISTS sales_2024 ( customer_id INT, product STRING, amount DOUBLE ); -- 插入 2023 年数据 INSERT INTO sales_2023 VALUES (1, 'Phone', 5000), (2, 'Laptop', 8000), (3, 'Tablet', 3000); -- 插入 2024 年数据 INSERT INTO sales_2024 VALUES (2, 'Laptop', 8000), (3, 'Tablet', 3000), (4, 'Watch', 2000);


合并数据

使用

UNION ALL
UNION ALL
将多个查询结果合并为一个结果集,保留所有行(包括重复行)。性能最优。

-- 合并两年销售数据 SELECT customer_id, product, amount FROM sales_2023 UNION ALL SELECT customer_id, product, amount FROM sales_2024 ORDER BY customer_id;

结果说明

customer_idproductamount
1Phone5000
2Laptop8000
2Laptop8000
3Tablet3000
3Tablet3000
4Watch2000

去重合并

使用

UNION
UNION
合并结果集并自动去除重复行。

-- 合并两年销售数据并去重 SELECT customer_id, product, amount FROM sales_2023 UNION SELECT customer_id, product, amount FROM sales_2024 ORDER BY customer_id;

结果说明

customer_idproductamount
1Phone5000
2Laptop8000
3Tablet3000
4Watch2000

查找共同数据

使用

INTERSECT
INTERSECT
返回两个结果集中都存在的记录(交集)。

-- 查找两年都有购买的客户和产品 SELECT customer_id, product, amount FROM sales_2023 INTERSECT SELECT customer_id, product, amount FROM sales_2024 ORDER BY customer_id;

结果说明

customer_idproductamount
2Laptop8000
3Tablet3000

查找差异数据

使用

EXCEPT
EXCEPT
返回在第一个结果集中存在但在第二个结果集中不存在的记录(差集)。

-- 查找 2023 年有但 2024 年没有的客户(流失客户) SELECT customer_id, product FROM sales_2023 EXCEPT SELECT customer_id, product FROM sales_2024 ORDER BY customer_id;

结果说明

customer_idproduct
1Phone

-- 查找 2024 年新增的客户 SELECT customer_id, product FROM sales_2024 EXCEPT SELECT customer_id, product FROM sales_2023 ORDER BY customer_id;

结果说明

customer_idproduct
4Watch

多表对比

组合使用集合操作进行更复杂的数据对比。

-- 查找仅在某一年出现的客户(对称差集) (SELECT customer_id FROM sales_2023 EXCEPT SELECT customer_id FROM sales_2024) UNION ALL (SELECT customer_id FROM sales_2024 EXCEPT SELECT customer_id FROM sales_2023) ORDER BY customer_id;

结果说明

customer_id
1
4

清理测试数据

完成集合操作验证后,建议清理测试表:

-- 删除测试表 DROP TABLE IF EXISTS sales_2023; DROP TABLE IF EXISTS sales_2024;


注意事项

  1. 列数和类型匹配:集合操作要求两个查询的列数相同,对应列的数据类型兼容。
  2. 列名以第一个查询为准:结果集的列名使用第一个
    SELECT
    SELECT
    的列名。
  3. ORDER BY 位置
    ORDER BY
    ORDER BY
    只能放在最后一个查询之后,作用于整个结果集。
  4. 性能差异
    UNION ALL
    UNION ALL
    性能最优(不去重),
    UNION
    UNION
    INTERSECT
    INTERSECT
    需要去重,
    EXCEPT
    EXCEPT
    需要哈希匹配。大数据量时优先使用
    UNION ALL
    UNION ALL
    + 后续处理。

相关文档

联系我们
预约咨询
微信咨询
电话咨询