Data Exploration with Data 360 SQL Queries — 用 SQL 探索、过滤和分析数据

Data Exploration with Data 360 SQL Queries 模块手把手教你用 SQL 探索 Data 360 数据:从编写 SELECT 查询、理解关键限定符字段,到用 WHERE/LIKE 过滤、ORDER BY/LIMIT 排序限制,用聚合函数与 GROUP BY/HAVING 汇总,用 INNER/OUTER JOIN 合并多对象,再到 CASE、字符串函数、CTE 与子查询等高级技术。...

📅 2026/4/7 ✍️ ponybai 🏷️ headless-360, salesforce, data-360

一、编写简单的 Data 360 SQL 查询

注册包含 Data 360 的自定义 Playground

要完成本徽章,您需要一个包含 Data 360 和示例数据的、限时的自定义 Playground

  1. 点击 Create Playground
  2. 新的 org 会自动附加到您的 Trailhead 账户;
  3. 记下 org 的到期日期,并在此之前完成本徽章。

连接您的数据

Data 360 中的连接始于设置数据流(data streams)——即连接或摄取到 Data 360 的数据源。来自这些数据源的数据存储在数据湖对象(DLO)中,DLO 是数据流数据的存储容器。如果数据需要处理,可以创建公式字段来规范化数据或做基础计算。

数据源可以是其他 Salesforce org、Marketing Cloud Engagement 业务单元、外部平台以及 CSV 文件。本徽章中,我们已经把 Sales Cloud 和 Service Cloud org 连接到了您的 Developer org,因此您只需添加数据流即可。

创建数据流

数据通过数据源摄取到 Data 360。数据源连接建立后,就可以添加数据流:

  1. 登录后,从 App Launcher 搜索并选择 Data Cloud
  1. 在 Data Cloud 中进入 Data Streams 标签页,点击 New
  2. 在 Connected Sources 下点击 Salesforce CRM,点击 Next
  3. 注意 Salesforce Org 已预先选中。从 View Bundles 选择 Sales 数据包,点击 Next
  1. 查看关联字段,点击 Next(字段出现可能需要几分钟);
  2. 注意默认 Data Space 已预先选中,数据包中所有字段都已列出。保持选择不变,点击 Deploy

部署可能需要几分钟。如果遇到问题,请稍等片刻后重试。这样就会创建六个新的数据流。

添加数据流

接下来添加一些数据流,把 Service Cloud 的案例数据连接到 Data 360:

  1. 在 Data Streams 窗口点击 New
  2. 选择 Salesforce CRM,点击 Next
  3. 选择 View Objects,搜索 Case
  4. 同时选中 CaseCase History,点击 Next
  1. 对以 Case 开头的对象,保持名称不变(Case_Home),从 Object Category 下拉框选择 Engagement
  2. 然后从 Event Time Field 下拉框选择 Created Date
  3. 点击 CaseHistory2,保持名称不变(CaseHistory2_Home),Object Category 选择 Other
  4. 点击 Next
  5. 确认默认数据空间已选中,点击 Deploy

创建查询工作区

设置分析环境:

  1. 在 Data Cloud 中进入 Query Editor 标签页,点击 New
  2. Workspace Name 输入 Customer Data Quality
  3. 保持 Data Space 为 Default;
  4. 点击 Save

创建此工作区后,您的查询将在正确的安全与访问协议内运行,并且能找到正确的对象进行分析。

编写您的第一个查询

每一次数据之旅都始于提出问题。在 Data 360 SQL 中,您通过编写查询(query)来提问。一个基本查询有两个必需的子句:SELECTFROM

  • SELECT 子句指定要检索哪些列(字段);
  • FROM 子句指定数据来源,始终是一个数据模型对象(DMO)数据湖对象(DLO)计算洞察对象(CIO)

您可以在 SELECT 子句中使用星号(*)通配符来检索 DMO 的每个字段,快速列出 Data 360 中的所有记录。虽然 SELECT * 写起来很快,但很少是最佳实践——它可能返回海量数据并拖慢查询。

选择特定字段

更高效的做法是只列出您需要的特定字段。这让查询运行更快,返回的结果集也更聚焦于分析所需的数据。

{sql('SELECT Name, Industry, AnnualRevenue FROM Account_Home')}

用逗号分隔字段名。字段名区分大小写,必须与 DLO schema 完全一致。例如,对于一份初始报告,您可能只需要名字和 ID。

理解关键限定符字段(KQ_Id__c)

处理 Data 360 记录时,您会经常看到一个名为 KQ_Id__c(key qualifier ID,关键限定符 ID)的字段。理解这个字段对保证后续联接(join)数据时的准确性至关重要。

KQ_Id__c 是一个内部标识符,帮助追踪 Data 360 系统中记录的来源和唯一性

  • DMO 中的每条记录都有一个主 ID(如 ssot__Id__c)与 KQ_Id__c 的唯一组合
  • 该标识符常用于在合并多个对象的数据时,确保正确关联到您打算使用的那条特定版本的记录。

最简单的记忆方式:主 ID 标识个体实体,而 KQ_Id__c 帮助您识别该实体对应的具体来源记录

添加注释作为最佳实践

随着查询变复杂(尤其是团队协作时),可读性至关重要。您可以在 SQL 语句中添加注释来解释逻辑、注明假设或暂时禁用部分代码。注释在执行查询时会被忽略。

有两种注释:

  • 单行注释:在行首(或注释掉一行的其余部分)使用两个连字符 --
  • 多行注释:用 /**/ 包裹跨多行的注释。

编写并运行查询

Customer Data Quality 工作区中执行 SQL 语句:

  1. 在主编辑器窗口粘贴查询以查看单条记录;
  2. 点击编辑器左上角的 Run Query
  3. 在屏幕底部的 Query Result 面板查看结果。
{sql("-- My first Data 360 query SELECT Name, Industry, AnnualRevenue FROM Account_Home")}

工作流程是迭代式的:编写 → 检查语法 → 运行 → 查看 → 修改。从简单开始,逐步增加复杂度。

保存查询

确认结果正确后,点击工作区右上角的 Save 按钮。保存的查询会出现在 Saved Queries 列表中,可以随时重跑、编辑以修改条件、与其他 Data 360 用户共享,或作为计算洞察的基础。

给查询起一个描述性的名称(如 High_Value_Accounts_By_Industry),并添加可选说明。为常见分析模式构建一个保存查询的库,可以大幅提升效率。

二、过滤、排序和限制查询结果

用 WHERE 过滤查询结果

在上一单元中,您学会了用 SELECT 和 FROM 编写简单查询。把分析聚焦到特定的数据子集,可以限制结果、锁定有用的部分。为此,使用 WHERE 子句来过滤结果。

WHERE 子句总是位于 FROM 子句之后,用于指定记录要被纳入最终结果集所必须满足的条件。

{sql("SELECT Name, Industry FROM Account_Home WHERE Industry = 'Technology'")}

使用比较和逻辑运算符

您可以使用标准比较运算符(如 =><!=)和逻辑运算符ANDOR)来定义条件。

  • > 是比较运算符;
  • AND 是逻辑运算符,要求两个条件都为真;
  • IS NULL 专门用于检查字段为空或未定义的记录,IS NOT NULL 则排除值缺失的记录;
  • OR 运算符在任一条件满足时返回记录;
  • 可用括号 () 分组复杂条件以提升清晰度。
{sql("SELECT Name, AnnualRevenue FROM Account_Home WHERE AnnualRevenue > 1000000 AND Industry IN ('Technology', 'Healthcare', 'Finance')")}

用 LIKE 搜索模式

有时您不知道要查找的确切值,或想匹配一组相关的文本值(字符串)。LIKE 运算符用于对文本字段做模式匹配

LIKE 与通配符配合使用:

  • 百分号 %:匹配任意长度(含零个)的字符序列;
  • 下划线 _:匹配任意单个字符。
{sql("-- 姓氏以 S 开头的客户 SELECT FirstName, LastName FROM Individual WHERE LastName LIKE 'S%'")}

注意:Data 360 中的 LIKE 是区分大小写的。要做不区分大小写的匹配,可配合 UPPER()LOWER() 函数使用。

排序和限制结果

即使经过 WHERE 过滤,查询仍可能返回成千上万条记录。为了让结果便于查看并定位特定记录,使用 ORDER BYLIMIT 子句。

  • ORDER BY → 按升序或降序排序结果;
  • LIMIT → 限制为前 N 行;
  • OFFSET → 跳过行(用于分页)。

这些子句在过滤之后、返回结果之前应用。

用 ORDER BY 排序数据

ORDER BY 子句按一个或多个指定字段对结果集排序。这一点很关键,因为没有它,结果的顺序可能不一致。

  • 升序(A-Z、1-100):使用 ASC 关键字(默认);
  • 降序(Z-A、100-1):使用 DESC 关键字。
{sql("-- 找出最近创建的 20 个个体 SELECT FirstName, ssot__createdDate__c FROM Individual ORDER BY ssot__createdDate__c DESC LIMIT 20")}

多列排序如 ORDER BY Industry ASC, AnnualRevenue DESC:先按行业字母顺序排序,再在每个行业内按收入从高到低排序。

用 LIMIT 和 OFFSET 控制行数

LIMIT 子句精确控制最终结果集返回多少行,最常与 ORDER BY 结合用于查找「前 N 条」记录(如最近 10 条记录或最低 5 个价格)。

OFFSET 子句与 LIMIT 配合使用,在开始返回结果集之前跳过指定数量的行。例如,要获取第 2 页的 20 条结果,就跳过前 20 条:LIMIT 20 OFFSET 20

{sql("-- 按收入排前 10 的账户 SELECT Name, AnnualRevenue FROM Account_Home ORDER BY AnnualRevenue DESC LIMIT 10")}

LIMIT 在查询管线中最后执行——在 WHERE、GROUP BY 和 ORDER BY 之后,因此返回的是所有过滤和排序完成后真正的前 N 条。

三、聚合数据获取高层洞察

为商业智能汇总数据

掌握了选择与过滤的基础后,关键的下一步是把原始数据变成高层指标和业务洞察。原始数据即使经过过滤也可能让人不知所措。Data 360 SQL 的聚合函数允许您从一组值计算出一个结果,例如总购买量、平均年龄或客户数量。

这些技术对于生成报表、理解宏观趋势和向利益相关者呈现业务洞察至关重要。聚合是仪表板、报表和计算洞察的基础——它把原始数据变成可操作的指标

使用聚合函数

聚合函数对一组行执行计算并返回一个汇总值,通常放在 SELECT 子句中。最常用的函数:

  • COUNT(*):返回输入行的数量;
  • SUM(expression):返回所有输入值之和;
  • AVG(expression):返回所有输入值的平均值(算术平均);
  • MIN(expression):返回输入值集中的最小值;
  • MAX(expression):返回输入值集中的最大值。
{sql("SELECT COUNT(*) AS TotalOrders, SUM(TotalAmount) AS TotalRevenue, AVG(TotalAmount) AS AvgOrderValue FROM ssot__SalesOrder_dlm")}

AS 给聚合结果起有意义的别名。除 COUNT(*) 外,所有聚合函数都会忽略 NULL

用 GROUP BY 分组结果

单个聚合值(如总收入)很有用,但分析通常需要按类别(或分组)拆分这些指标。要对每个唯一分组执行计算,使用 GROUP BY 子句。

  • 在 SELECT 列表中包含要分组的类别字段;
  • 在 GROUP BY 子句中包含同样的类别字段。
{sql("SELECT ssot__CountryId__c AS Country, AVG(TotalAmount) AS AvgOrderValue FROM ssot__SalesOrder_dlm GROUP BY ssot__CountryId__c ORDER BY AvgOrderValue DESC")}

规则:SELECT 子句中任何未聚合的字段都必须出现在 GROUP BY 子句中。GROUP BY 把「所有账户」变成「按行业的账户」——这是最常见的商业智能模式。

用 HAVING 过滤分组

您已经知道 WHERE 子句在分组和聚合之前过滤单行。要对汇总结果——即分组本身——应用条件,使用 HAVING 子句。

HAVING 子句过滤聚合函数的输出,总是位于 GROUP BY 子句之后

{sql("SELECT ssot__CountryId__c AS Country, AVG(TotalAmount) AS AvgOrderValue FROM ssot__SalesOrder_dlm GROUP BY ssot__CountryId__c HAVING AVG(TotalAmount) > 500")}

WHERE 与 HAVING 的区别:WHERE 在 GROUP BY 之前过滤,HAVING 在 GROUP BY 之后过滤分组。两者可以在同一个查询中一起使用——WHERE 处理行级条件,HAVING 处理分组级条件。

四、用联接合并多个对象的数据

探索联接的用途

到目前为止,您都只从单个 DMO 或 DLO 查询数据。但在 Data 360 中,客户信息天然地分布在多个对象中——例如客户的画像在 Individual DMO 中,而其邮箱地址在 ContactPointEmail DMO 中。

要创建客户的统一视图,就需要使用联接(join)。联接基于两者共享的相关字段,把两个或更多 DMO/DLO 的数据合并,从而把分散的信息(如个体姓名和对应邮箱地址)汇聚到一个结果集中。

  • INNER JOIN → 只返回两表都有匹配值的行;
  • LEFT OUTER JOIN → 左表所有行 + 右表匹配行;
  • RIGHT OUTER JOIN → 右表所有行 + 左表匹配行;
  • FULL OUTER JOIN → 两表所有行。

联接是现实世界数据分析中最强大也最常见的 SQL 操作。

内联接(INNER JOIN)

INNER JOIN 是最常见的联接类型,只返回两张表中指定联接字段有匹配值的行,只存在于其中一张表的记录会被排除。

{sql("SELECT i.FirstName, i.LastName, e.EmailAddress FROM Individual i INNER JOIN ContactPointEmail e ON i.ssot__IndividualId__c = e.ssot__IndividualId__c")}

该查询把 Individual DMO 与 ContactPointEmail DMO 通过公共键 ssot__IndividualId__c 联接,只有 Individual ID 同时存在于两个 DMO 中的记录才会被纳入。注意别名(i.e.)用来明确指定每个字段来自哪张表。

用 INNER JOIN 的场景:只想要两表都存在的记录(如「有邮箱联系点记录的个体」)。

外联接(OUTER JOIN)

有时您需要包含那些在另一张表中没有匹配的记录,这时就要用外联接。

  • LEFT OUTER JOIN(LEFT JOIN):返回左表(FROM 中先列出的表)所有行 + 右表匹配行;左表某行无匹配时,右表字段返回 NULL。用于「所有个体,包括没有邮箱地址的」;
  • RIGHT OUTER JOIN(RIGHT JOIN):返回右表所有行 + 左表匹配行;
  • FULL OUTER JOIN(FULL JOIN):返回两表所有行,无匹配一侧的列返回 NULL。

为简洁和可移植,通常优先使用 LEFT JOIN。如果需要 RIGHT JOIN,一般只需交换两表顺序并用 LEFT JOIN 即可实现相同结果。用 NULL 检查可识别缺失的关系(如「哪些账户没有商机」)。

联接最佳实践:使用关键限定符

在单元一中您已了解关键限定符(KQ_Id__c)字段。对于大多数查询——尤其是涉及一对多关系的(如一个 Individual 有多个 Contact Point)——Data 360 通常要求同时按主 ID 和 KQ_Id__c 联接,以获得最准确、唯一的结果。

更稳健的邮箱列表联接如下:

{sql("SELECT i.FirstName, i.LastName, e.EmailAddress FROM Individual i INNER JOIN ContactPointEmail e ON i.ssot__IndividualId__c = e.ssot__IndividualId__c AND i.KQ_Id__c = e.KQ_IndividualId__c")}

同时按两个字段联接是 Data 360 SQL 中的最佳实践,可确保正确关联到记录的特定、限定版本。其他实践还包括:给表起短别名、选择正确的联接类型、使用表限定的列名(如 a.Name)以防歧义。

五、使用高级 SQL 技术

释放查询的全部潜力

高级 SQL 技术超越了基础的 SELECT 和 WHERE,能处理复杂的业务逻辑。本单元涵盖:

  • CASE 表达式 → 查询中的条件逻辑;
  • 字符串函数 → 文本处理;
  • CTE(通用表表达式) → 简化复杂查询;
  • 子查询 → 查询中的查询。

这些技术可实现数据分类、文本清洗、层级分析和多步数据转换——全都在 SQL 中完成,而无需单独的数据转换任务。

用 CASE 和字符串函数转换数据

两种强大的转换技术:

  • CASE → 条件逻辑:根据条件对数据进行分类、分桶和重新归类;
  • 字符串函数 → 文本处理:拼接、提取子串、转换大小写、去除空格。

它们直接在 SQL 中把原始数据转换成分析就绪的格式,而无需单独的批量数据转换任务——把转换逻辑与分析逻辑放在一起。

用 CASE 应用条件逻辑

CASE 表达式让您在 SELECT 语句中直接实现 if/then/else 逻辑:检查字段值是否满足一个或多个条件,并返回相应结果,非常适合创建业务分类。

{sql("SELECT Name, AnnualRevenue, CASE WHEN AnnualRevenue > 1000000 THEN 'Enterprise' WHEN AnnualRevenue > 100000 THEN 'Mid-Market' ELSE 'Small Business' END AS AccountTier FROM Account_Home")}

每条记录按顺序评估 WHEN 条件,第一个匹配的条件决定结果;ELSE 为不匹配的行提供默认值。CASE 让数据分类变得声明式和可重复——如客户分层(Enterprise/Mid/Small)、数据标准化、标记创建(At Risk/On Track/Ahead)。

用字符串函数操作文本

字符串函数对规范化、清洗文本数据至关重要,能确保过滤或分组时的准确性。常用函数:

  • CONCAT(a, b) → 拼接字符串;
  • UPPER(text) / LOWER(text) → 转换大小写;
  • TRIM(text) → 去除首尾空格;
  • SUBSTRING(text, start, length) → 提取子串;
  • LENGTH(text) → 字符数;
  • REPLACE(text, old, new) → 查找替换。
{sql("-- 提取产品代码前 3 个字符以识别产品家族 SELECT SUBSTRING(ProductCode, 1, 3) AS ProductFamily FROM Product")}

字符串函数处理文本数据的「脏乱」现实——大小写不一致的姓名、含多余空格的地址、嵌在长字符串里的 ID,都能直接在 SQL 中清洗和标准化。

简化和优化查询

随着分析变复杂、需要多步过滤和计算,查询会变长、难以阅读。CTE子查询有助于组织和优化这些复杂逻辑:

  • CTE(通用表表达式) → 把复杂查询拆成命名、可复用的子块;
  • 子查询(subquery) → 在查询中嵌套另一个查询用于过滤或比较。

两者都能让复杂查询更易读、更易维护,通常也更高效。

用 CTE 简化复杂查询

通用表表达式(CTE)是在单个 SELECT 语句的执行范围内定义的临时、命名结果集,使用 WITH 子句定义。CTE 非常适合把多步查询拆解成逻辑、可读的部分。

{sql("WITH HighValueAccounts AS ( SELECT KQ_Id__c, Name, AnnualRevenue FROM Account_Home WHERE AnnualRevenue > 1000000 ) SELECT * FROM HighValueAccounts WHERE Industry = 'Technology'")}

在此示例中,HighValueAccounts CTE 先被计算,然后在最终 SELECT 中像标准 DMO 一样被引用。CTE 的收益:可读性(每个 CTE 代表一个逻辑步骤)、可复用性可维护性——相当于 SQL 中的「变量」或「函数」。

用子查询检查相关数据

子查询(subquery)是嵌套在另一个 SELECT 语句内的查询,常用于 WHERE 子句中,基于相关 DMO 的数据过滤主查询,而无需完整联接。

EXISTS 运算符检查子查询是否返回任何行,效率很高——因为子查询一找到第一个匹配就停止。用 EXISTS 找出至少有一条相关销售订单的所有个体;相反,NOT EXISTS 在子查询不返回任何行时返回 TRUE,可用来识别「没有销售订单记录」的高风险客户。

{sql("SELECT Name FROM Account_Home WHERE EXISTS ( SELECT 1 FROM Opportunity_Home o WHERE o.KQ_AccountId__c = Account_Home.KQ_Id__c AND o.Amount > 10000 )")}

子查询功能强大,但大数据集上可能较慢——性能敏感时考虑改用 CTE 或 JOIN。


文章来源:Trailhead - Data Exploration with Data 360 SQL Queries