

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 转换数据
<a name="v9-panels-xform"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

转换是一种强大方法，可在系统应用可视化之前处理查询返回的数据。通过转换，您可以：
+ 重命名字段
+ 连接时间序列数据
+ 跨查询执行数学运算
+ 将一个转换的输出用作另一个转换的输入

对于依赖同一数据集中多个视图的用户来说，转换是一种创建和维护大量控制面板的有效方法。

您也可以将一个转换的输出用作另一个转换的输入，从而提高性能。

**注意**  
有时，系统无法绘制转换后的数据。发生这种情况时，单击可视化上方的**表视图**切换按钮，以切换到数据的表视图。这有助于您了解转换的最终结果。

## 转换类型
<a name="v9-panels-xform-types"></a>

Grafana 提供了多种转换数据的方式。下面是转换函数的完整列表。

## 转换顺序
<a name="v9-panels-xform-order"></a>

当存在多个转换时，Grafana 会按其列出的顺序来应用。每次转换都会创建一个新的结果集，然后传递给处理管道中的下一个转换。

Grafana 应用转换的顺序会直接影响结果。例如，如果使用 Reduce 转换将一列的所有结果压缩为单个值，则只能对该值应用转换。

## 向数据添加转换函数
<a name="v9-panels-xform-add"></a>

以下步骤将指导您向数据添加转换。

**向面板添加转换**

1. 导航到要在其中添加一个或多个转换的面板。

1. 选择面板标题，然后单击**编辑**。

1. 选择 **Transform (转换)** 选项卡。

1. 选择转换。此时会显示一个转换行，您可以在其中配置转换选项。

1. 要应用另一个转换，请选择**添加转换**。这次转换对上一次转换返回的结果执行操作。

## 调试转换
<a name="v9-panels-xform-debug"></a>

要查看转换的输入和输出结果集，请选择转换行右侧的调试图标。

输入和输出结果集有助于调试转换。

## 删除转换
<a name="v9-panels-xform-delete"></a>

建议删除不需要的转换。删除转换时，即从可视化中删除数据。

先决条件：

识别所有依赖转换的控制面板，并通知受影响的控制面板用户。

**删除转换**

1. 打开面板进行编辑。

1. 选择 **Transform (转换)** 选项卡。

1. 选择要删除的转换旁边的垃圾桶图标。

## 转换函数
<a name="v9-panels-xform-functions"></a>

您可以对数据执行以下转换。

**从计算添加字段**

使用此转换可以添加一个根据其他两个字段计算得出的新字段。每次转换都允许您添加一个新字段。
+ **模式**：选择一种模式：
  + **减少行**：对选定字段的每一行分别应用所选计算。
  + **二元选项**：对两个选定字段的单行中的值应用基本的数学运算（求和、乘法等）。
+ **字段名称**：选择要在新字段的计算中使用的字段名称。
+ **计算**：如果您选择**减少行**模式，则会出现**计算**字段。单击字段以查看可用于创建新字段的计算选项列表。有关可用计算的信息，请参阅[计算类型](v9-panels-calculation-types.md)。
+ **运算**：如果您选择**二元选项**模式，则出现**运算**字段。通过这些字段，您可以对来自两个选定字段的单行中的值进行基本数学运算。也可以使用数值进行二元运算。
+ **别名**：（可选）输入新字段的名称。如果将此项保留为空，则将对该字段命名以与计算匹配。
+ **替换所有字段**：（可选）如果您想在可视化中隐藏所有其他字段并仅显示经过计算字段，请使用此选项。

**连接字段**

这种转换将所有帧中的所有字段合并为一个结果。考虑以下两个查询。

查询 A：


| 临时文件 | 正常运行时间 | 
| --- | --- | 
|  15.4  |  1230233  | 

查询 B：


| AQI | 错误 | 
| --- | --- | 
|  3.2  |  5  | 

连接字段后，数据帧为：


| 临时文件 | 正常运行时间 | AQI | 错误 | 
| --- | --- | --- | --- | 
|  15.4  |  1230233  |  3.2  |  5  | 

**来自查询结果的配置**

通过这种转换，您可以选择一个查询，从中提取**最小值**、**最大值**、**单位**和**阈值**等标准选项，并将其应用于其他查询结果。这实现了动态查询驱动的可视化配置。

如果您想为配置查询结果中的每一行提取唯一配置，请尝试行到字段的转换。

**Options**
+ **配置查询**：选择返回要用作配置的数据的查询。
+ **应用于**：选择要对哪些字段或序列应用配置。
+ **应用于选项**：通常是字段类型或字段名称正则表达式，具体取决于您在**应用于**中选择的选项。

**转换字段类型**

此转换会更改指定字段的字段类型。
+ **字段**：从可用字段中选择
+ **as** — 选择 FieldType 要转换为
  + **数字**：尝试将值变为数字
  + **字符串**：将值设为字符串
  + **时间**：尝试将值解析为时间
    + 将显示一个选项，用于通过诸 DateFormat 如 yyyy-mm-dd或 DD MM YYYY hh: mm: ss 之类的字符串将 a 指定为输入
  + **布尔值**：将值变为布尔值

例如，可通过选择时间字段“Time”和日期格式“YYYY”来修改以下查询。


| 时间 | 标记 | 值 | 
| --- | --- | --- | 
|  7/1/2017  |  高于  |  25  | 
|  8/2/2018  |  低于  |  22  | 
|  9/2/2019  |  低于  |  29  | 
|  10/4/2020  |  高于  |  22  | 

结果：


| 时间 | 标记 | 值 | 
| --- | --- | --- | 
|  1/1/2017  |  高于  |  25  | 
|  1/1/2018  |  低于  |  22  | 
|  2019 年 1 月 1 日  |  低于  |  29  | 
|  1/1/2020  |  高于  |  22  | 

**按名称筛选数据**

使用此转换可以移除部分查询结果。

Grafana 显示**标识符**字段，后面是您的查询返回的字段。

您可以通过以下两种方式之一应用筛选器：
+ 输入正则表达式。
+ 选择一个字段以切换对该字段的筛选。筛选后的字段显示为深灰色文本，未筛选的字段包含白色文本。

**按查询筛选数据**

如果您想要隐藏一个或多个查询，请在包含多个查询的面板中使用此转换。

Grafana 以深灰色文本显示查询标识字母。单击查询标识符以切换筛选。如果查询字母是白色的，则会显示结果。如果查询字母是深色的，则会隐藏结果。

**注意**  
这种转换不适用于 Graphite，因为此数据来源不支持将返回的数据与查询关联。

**按值筛选数据**

此转换允许您直接在 Grafana 中筛选数据，并从查询结果中删除一些数据点。您可以选择包含或排除与您定义的一个或多个条件相匹配的数据。这些条件将应用于选定的字段。

如果您的数据来源未按值进行本机筛选，则此转换非常有用。如果您使用的是共享查询，也可以使用它来缩小要显示的值的范围。

所有字段的可用条件如下：
+ **正则表达式**：匹配正则表达式
+ **为 Null 值**：如果值为 null 值，则匹配
+ **为非 Null 值**：如果值为非 null 值，则匹配
+ **等于**：如果值等于指定值，则匹配
+ **不同**：如果值与指定值不同，则匹配

数值字段的可用条件如下：
+ **大于**：如果值大于指定值，则匹配
+ **小于**：如果值小于指定值，则匹配
+ **大于或等于**：如果值大于或等于指定值，则匹配
+ **小于或等于**：如果值小于或等于指定值，则匹配
+ **范围**：匹配指定的最小值和最大值之间的范围，包括最小值和最大值

考虑以下数据集：


| 时间 | 温度 | 海拔 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:23  |  32  |  101  | 
|  7/7/2020 上午 11:34:22  |  28  |  125  | 
|  7/7/2020 上午 11:34:21  |  26  |  110  | 
|  7/7/2020 上午 11:34:20  |  23  |  98  | 
|  7/7/2020 上午 10:32:24  |  31  |  95  | 
|  7/7/2020 上午 10:31:22  |  20  |  85  | 
|  7/7/2020 上午 9:30:57  |  19  |  101  | 

如果**包括**温度低于 30°C 的数据点，配置将如下所示：
+ **筛选条件类型**：`Include`
+ **条件**：`Temperature` 匹配 `Lower Than 30` 的行

您将得到以下结果，其中仅包括低于 30°C 的温度：


| 时间 | 温度 | 海拔 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:22  |  28  |  125  | 
|  7/7/2020 上午 11:34:21  |  26  |  110  | 
|  7/7/2020 上午 11:34:20  |  23  |  98  | 
|  7/7/2020 上午 10:31:22  |  20  |  85  | 
|  7/7/2020 上午 9:30:57  |  19  |  101  | 

您可以向筛选器添加多个条件。例如，您可能希望仅在海拔大于 100 时才包含数据。为此，请将该条件添加到以下配置：
+ 筛选条件类型：符合 `Match All` 条件的 `Include` 行
+ 条件 1：`Temperature` 匹配 `Lower` 而非 `30` 的行
+ 条件 2：`Altitude` 匹配 `Greater` 而非 `100` 的行

当您有多个条件时，您可以选择是希望将操作（包括/排除）应用于您添加的 **Match all** 条件的行，还是 **Match any** 条件的行。

在上面的示例中，我们之所以选择 **Match all**，是因为我们希望包括温度低于 30 且海拔高于 100 的行。如果我们想包括温度低于 30 或海拔高于 100 的行，则可以选择 **Match any**。这包括原始数据中的第一行，该行的温度为 32°C（与第一个条件不匹配），但海拔高度为 101（与第二个条件匹配），因此包括在内。

无效或配置不完整的条件将被忽略。

**Group by** (分组依据)

此转换按指定的字段（列）值对数据进行分组，并处理每个组的计算。单击以查看计算选项的列表。

以下是原始数据的示例：


| 时间 | Server ID | CPU 温度 | 服务器状态 | 
| --- | --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  server 1  |  80  |  关闭  | 
|  7/7/2020 上午 11:34:20  |  server 3  |  62  |  OK  | 
|  7/7/2020 上午 10:32:20  |  server 2  |  90  |  过载  | 
|  7/7/2020 上午 10:31:22  |  server 3  |  55  |  正常  | 
|  7/7/2020 上午 9:30:57  |  server 3  |  62  |  Rebooting  | 
|  7/7/2020 上午 9:30:05  |  server 2  |  88  |  OK  | 
|  7/7/2020 上午 9:28:06  |  server 1  |  80  |  OK  | 
|  7/7/2020 上午 9:25:05  |  server 2  |  88  |  OK  | 
|  7/7/2020 上午 9:23:07  |  server 1  |  86  |  OK  | 

该转换分两个步骤。首先，指定一个或多个字段作为数据分组依据。这会将这些字段的所有相同值分组到一起，就像对它们进行排序一样。例如，如果我们按服务器 ID 字段分组，则其将按以下方式对数据分组：


| 时间 | Server ID | CPU 温度 | 服务器状态 | 
| --- | --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  server 1  |  80  |  关闭  | 
|  7/7/2020 上午 9:28:06  |  server 1  |  80  |  OK  | 
|  7/7/2020 上午 9:23:07  |  server 1  |  86  |  OK  | 
|  7/7/2020 上午 10:32:20  |  server 2  |  90  |  过载  | 
|  7/7/2020 上午 9:30:05  |  server 2  |  88  |  OK  | 
|  7/7/2020 上午 9:25:05  |  server 2  |  88  |  OK  | 
|  7/7/2020 上午 11:34:20  |  server 3  |  62  |  OK  | 
|  7/7/2020 上午 10:31:22  |  server 3  |  55  |  正常  | 
|  7/7/2020 上午 9:30:57  |  server 3  |  62  |  Rebooting  | 

包含相同服务器 ID 值的所有行将分组在一起。

选择作为数据分组依据的字段后，可以在其他字段上添加各种计算，计算将应用于每组行。例如，您可能想要计算每台服务器的平均 CPU 温度。因此，我们可以将应用于 CPU 温度字段的*平均值*计算相加，得到以下结果：


| Server ID | CPU 温度（平均值） | 
| --- | --- | 
|  server 1  |  82  | 
|  server 2  |  88.6  | 
|  server 3  |  59.6  | 

我们可以添加多个计算。例如：
+ 对于“时间”字段，我们可以计算*上个*值，以了解每台服务器上一个数据点的接收时间
+ 对于“服务器状态”字段，我们可以计算*上个*值，以了解每台服务器上一次的状态值。
+ 对于“温度”字段，我们可以计算*上个*值，以了解每台服务器的最新监控温度。

然后我们会得到：


| Server ID | CPU 温度（平均值） | CPU 温度（上个值） | 时间（上个值） | 服务器状态（上个值） | 
| --- | --- | --- | --- | --- | 
|  server 1  |  82  |  80  |  7/7/2020 上午 11:34:20  |  关闭  | 
|  server 2  |  88.6  |  90  |  7/7/2020 上午 10:32:20  |  过载  | 
|  server 3  |  59.6  |  62  |  7/7/2020 上午 11:34:20  |  OK  | 

此转换使您能够从时间序列中提取关键信息，并以便捷的方式显示这些信息。

**按字段连接**

使用此转换将多个结果连接到一个表中。这对于将多个时间序列结果转换为具有共享时间字段的单个宽表特别有用。

*内连接*

内连接合并多个表中的数据，其中所有表共享选定字段中的相同值。这种类型的连接会排除每个结果中值不匹配的数据。

使用此转换将多个查询结果（通过连接字段或首次列组合）合并为一个结果，并删除无法成功连接的行。

在以下示例中，两个查询返回表数据。在应用内连接转换之前，将其可视化为两个独立的表。

查询 A：


| 时间 | 任务 | 正常运行时间 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  节点  |  25260122  | 
|  7/7/2020 上午 11:24:20  |  postgre  |  123001233  | 
|  7/7/2020 上午 11:14:20  |  postgre  |  345001233  | 

查询 B：


| 时间 | 服务器 | 错误 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  server 1  |  15  | 
|  7/7/2020 上午 11:24:20  |  server 2  |  5  | 
|  7/7/2020 上午 11:04:20  |  server 3  |  10  | 

应用内连接转换后的结果如下所示：


| 时间 | 任务 | 正常运行时间 | 服务器 | 错误 | 
| --- | --- | --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  节点  |  25260122  |  server 1  |  15  | 
|  7/7/2020 上午 11:24:20  |  postgre  |  123001233  |  server 2  |  5  | 

*外连接*

外连接包括来自内连接的所有数据，以及在每个输入中值不匹配的行。内连接在时间字段上连接查询 A 和查询 B，而外连接包括所有在时间字段上不匹配的行。

在以下示例中，两个查询返回表数据。在应用外连接转换之前，将其可视化为两个表。

查询 A：


| 时间 | 任务 | 正常运行时间 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  节点  |  25260122  | 
|  7/7/2020 上午 11:24:20  |  postgre  |  123001233  | 
|  7/7/2020 上午 11:14:20  |  postgre  |  345001233  | 

查询 B：


| 时间 | 服务器 | 错误 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  server 1  |  15  | 
|  7/7/2020 上午 11:24:20  |  server 2  |  5  | 
|  7/7/2020 上午 11:04:20  |  server 3  |  10  | 

应用外连接转换后的结果如下所示：


| 时间 | 任务 | 正常运行时间 | 服务器 | 错误 | 
| --- | --- | --- | --- | --- | 
|  7/7/2020 上午 11:04:20  |    |    |  server 3  |  10  | 
|  7/7/2020 上午 11:14:20  |  postgre  |  345001233  |    |    | 
|  7/7/2020 上午 11:34:20  |  节点  |  25260122  |  server 1  |  15  | 
|  7/7/2020 上午 11:24:20  |  postgre  |  123001233  |  server 2  |  5  | 

**标签到字段**

此转换将包含标签或标记的时间序列结果更改为表，其中每个标签键和值都包含在表结果中。标签可以显示为列或行值。

给定两个时间序列的查询结果：
+ 序列 1：标签 Server=Server A，Datacenter=EU
+ 序列 2：标签 Server=Server B，Datacenter=EU

在**列**模式下，结果如下所示：


| 时间 | 服务器 | Datacenter | 值 | 
| --- | --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  Server A  |  EU  |  1  | 
|  7/7/2020 上午 11:34:20  |  Server B  |  EU  |  2  | 

在“行”模式下，结果对每个序列都创建一个表，并显示每个标签值，如下所示：


| label | 值 | 
| --- | --- | 
|  服务器  |  Server A  | 
|  Datacenter  |  EU  | 


| label | 值 | 
| --- | --- | 
|  服务器  |  Server B  | 
|  Datacenter  |  EU  | 

*值字段名称*

如果您选择 Server 作为**值字段名称**，则 Server 标签的每个值都将获得一个字段。


| 时间 | Datacenter | Server A | Server B | 
| --- | --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  EU  |  1  |  2  | 

*合并行为*

标签到字段转换器在内部是两个独立的转换。第一个作用于单个序列，并将标签提取到字段。第二个是合并转换，将所有结果合并到一个表。合并转换会尝试连接所有匹配字段。此合并步骤是必需的，无法关闭。

**注意**  
*合并*转换可以单独使用，详细说明如下。

为了说明这一点，这里有一个示例，其中有两个查询返回没有重叠标签的时间序列。
+ 序列 1：标签 Server=ServerA
+ 序列 2：标签 Datacenter=EU

首先会生成这两个表：


| 时间 | 服务器 | 值 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  ServerA  |  10  | 


| 时间 | Datacenter | 值 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  EU  |  20  | 

合并后：


| 时间 | 服务器 | 值 | Datacenter | 
| --- | --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  ServerA  |  10  |    | 
|  7/7/2020 上午 11:34:20  |    |  20  |  EU  | 

**合并** 

使用此转换将来自多个查询的结果合并为一个结果。这在使用表面板可视化时很有用。可以合并的值将合并到同一行中。如果共享字段包含相同的数据，则可以合并值。

在下面的示例中，我们有两个返回表数据的查询。在应用转换之前，将其可视化为两个独立的表。

查询 A：


| 时间 | 任务 | 正常运行时间 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  节点  |  25260122  | 
|  7/7/2020 上午 11:24:20  |  postgre  |  123001233  | 

查询 B：


| 时间 | 任务 | 错误 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  节点  |  15  | 
|  7/7/2020 上午 11:24:20  |  postgre  |  5  | 

以下是应用合并转换后的结果：


| 时间 | 任务 | 错误 | 正常运行时间 | 
| --- | --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  节点  |  15  |  25260122  | 
|  7/7/2020 上午 11:24:20  |  postgre  |  5  |  123001233  | 

**整理字段**

使用此转换可以重命名、重新排序或隐藏查询返回的字段。

**注意**  
此转换仅适用于具有单个查询的面板。如果您的面板有多个查询，则必须应用外连接转换或删除多余的查询。

Grafana 会显示查询返回的字段列表。你可以：
+ 将光标悬停在字段上以更改字段顺序。光标变成手形，然后您就可以将该字段拖到新的位置。
+ 通过单击字段名称旁边的眼睛图标隐藏或显示字段。
+ 通过在重命名框中键入新名称来重命名字段。

**按值分区**

在绘制多个序列时，这种转换可避免使用不同 `WHERE` 子句对同一数据来源进行多次查询。考虑一个包含以下数据的指标 SQL 表：


| 时间 | Region | 值 | 
| --- | --- | --- | 
|  2022 年 10 月 20 日下午 12:00:00  |  美国  |  1520  | 
|  2022 年 10 月 20 日下午 12:00:00  |  EU  |  2936  | 
|  2022 年 10 月 20 日凌晨 1:00:00  |  美国  |  1327  | 
|  2022 年 10 月 20 日凌晨 1:00:00  |  EU  |  912  | 

在 v9.3 之前，如果你想在同一个 TimeSeries 面板中绘制美国的红色趋势线和欧盟的蓝色趋势线，你可能需要将其分成两个查询：

```
SELECT Time, Value FROM metrics WHERE Time > '2022-10-20' AND Region='US'
SELECT Time, Value FROM metrics WHERE Time > '2022-10-20' AND Region='EU'
```

这还需要您提前知道指标表中实际存在哪些区域。

通过*按值分区*转换器，您可以发出单个查询，并根据您选择的一个或多个列（`fields`）中的唯一值来拆分结果。下面的示例使用了 `Region`。

```
SELECT Time, Region, Value FROM metrics WHERE Time > '2022-10-20'
```


| 时间 | Region | 值 | 
| --- | --- | --- | 
|  2022 年 10 月 20 日下午 12:00:00  |  美国  |  1520  | 
|  2022 年 10 月 20 日凌晨 1:00:00  |  美国  |  1327  | 


| 时间 | Region | 值 | 
| --- | --- | --- | 
|  2022 年 10 月 20 日下午 12:00:00  |  EU  |  2936  | 
|  2022 年 10 月 20 日凌晨 1:00:00  |  EU  |  912  | 

**Reduce**

*Reduce* 转换将计算应用于帧中的每个字段，并返回单个值。应用此转换时，将删除时间字段。

考虑以下输入：

查询 A：


| 时间 | 临时文件 | 正常运行时间 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  12.3  |  256122  | 
|  7/7/2020 上午 11:24:20  |  15.4  |  1230233  | 

查询 B：


| 时间 | AQI | 错误 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  6.5  |  15  | 
|  7/7/2020 上午 11:24:20  |  3.2  |  5  | 

reduce 转换器具有两种模式：
+ **序列到行**：为每个字段创建一行，为每个计算创建一列。
+ **减少字段**：保留现有的框架结构，但将每个字段折叠为单个值。

例如，如果将**第一个**和**最后一个**计算与**序列到行**转换一起使用，则结果为：


| 字段 | 第一个 | Last | 
| --- | --- | --- | 
|  临时文件  |  12.3  |  15.4  | 
|  正常运行时间  |  256122  |  1230233  | 
|  AQI  |  6.5  |  3.2  | 
|  错误  |  15  |  5  | 

最后一次计算的 Reduce 字段会产生两个帧，每个帧都有一行：

查询 A：


| 临时文件 | 正常运行时间 | 
| --- | --- | 
|  15.4  |  1230233  | 

查询 B：


| AQI | 错误 | 
| --- | --- | 
|  3.2  |  5  | 

**按正则表达式重命名**

使用此转换，可以使用正则表达式和替换模式来重命名部分查询结果。

您可以指定一个正则表达式，该正则表达式只应用于匹配，同时指定一个支持反向引用的替换模式。例如，假设您在可视化每台主机的 CPU 使用情况，并希望删除域名。您可以将正则表达式设置为 `([^\.]+)\..+`，并将替换模式设置为 `$1`，`web-01.example.com` 将变为 `web-01`。

**行到字段**

行到字段的转换将行转换为单独的字段。这非常有用，因为可以单独设置字段的样式和配置。还可以使用附加字段作为动态字段配置的来源，或将其映射到字段标签。然后，可以使用其他标签为生成的字段定义更好的显示名称。

此转换包括一个字段表，该表列出了配置查询返回的数据中的所有字段。通过此表，您可以控制应将哪些字段映射到每个配置属性（\$1用作\$1\$1选项）。如果返回的数据中有多行，您还可以选择要选择的值。

这种转换需要：
+ 一个字段用作字段名称的来源。

  默认情况下，转换使用第一个字符串字段作为来源。您可以在要使用的字段的**用作**列中选择**字段名称**，来覆盖此默认设置。
+ 一个字段用作值的来源。

  默认情况下，转换使用第一个数字字段作为来源。但您可以在要使用的字段的**用作**列中选择**字段值**，来覆盖此默认设置。

在以下位置可视化数据时非常有用：
+ 计量表
+ Stat
+ 饼图

*将多余字段映射到标签*

如果字段未映射到配置属性，Grafana 会自动将其用作输出字段上标签的来源：

示例：


| Name | DataCenter | 值 | 
| --- | --- | --- | 
|  ServerA  |  美国  |  100  | 
|  ServerB  |  EU  |  200  | 

输出：


| ServerA（标签： DataCenter: 美国） | ServerB（标签： DataCenter：欧盟） | 
| --- | --- | 
|  10  |  20  | 

现在可以在字段显示名称中使用额外的标签，提供更完整的字段名称。

如果要从一个查询中提取配置并将其应用于另一个查询，则应使用查询结果转换中的配置。

*示例*

输入：


| Name | 值 | 最大值 | 
| --- | --- | --- | 
|  ServerA  |  10  |  100  | 
|  ServerB  |  20  |  200  | 
|  ServerC  |  30  |  300  | 

输出：


| ServerA（配置：max=100） | ServerB（配置：max=200） | ServerC（配置：max=300） | 
| --- | --- | --- | 
|  10  |  20  |  30  | 

如您所见，来源数据中的每一行都变成一个单独的字段。现在，每个字段还设置了最大配置选项。最小值、最大值、单位和阈值等选项都是字段配置的一部分，如果这样设置，可视化将使用这些选项，而不是在面板编辑器选项窗格中手动配置的任何选项。

**准备时间序列**

当数据来源以您要使用的面板不支持的格式返回时间序列数据时，准备时间序列转换非常有用。

这种转换通过将时间序列数据从宽格式转换为长格式或反过来，来帮助您解决此问题。

选择**多帧时间序列**选项，将时间序列数据框从宽格式转换为长格式。

选择**宽时间序列**选项，将时间序列数据框从长格式转换为宽格式。

**序列到行**

使用此转换可将多个时间序列数据查询的结果合并为一个结果。这在使用表面板可视化时很有用。

此转换的结果将包含三列：时间、指标和值。添加指标列是为了方便您查看该指标来自哪个查询。通过在来源查询上定义标签来自定义此值。

在下面的示例中，有两个查询返回时间序列数据。在应用转换之前，将其可视化为两个独立的表。

查询 A：


| 时间 | 温度 | 
| --- | --- | 
|  7/7/2020 上午 11:34:20  |  25  | 
|  7/7/2020 上午 10:31:22  |  22  | 
|  7/7/2020 上午 9:30:05  |  19  | 

查询 B：


| 时间 | 湿度 | 
| --- | --- | 
|  7/7/2020 上午 11:34:20  |  24  | 
|  7/7/2020 上午 10:32:20  |  29  | 
|  7/7/2020 上午 9:30:57  |  33  | 

以下是将序列应用于行转换后的结果。


| 时间 | 指标 | 值 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  温度  |  25  | 
|  7/7/2020 上午 11:34:20  |  湿度  |  22  | 
|  7/7/2020 上午 10:32:20  |  湿度  |  29  | 
|  7/7/2020 上午 10:31:22  |  温度  |  22  | 
|  7/7/2020 上午 9:30:57  |  湿度  |  33  | 
|  7/7/2020 上午 9:30:05  |  温度  |  19  | 

**排序依据**

此转换将按配置的字段对每一帧排序，选中 `reverse` 后，值将按相反的顺序返回。

**限制**

使用此转换来限制显示的行数。

在下面的示例中，我们从数据来源获得了以下响应：


| 时间 | 指标 | 值 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  温度  |  25  | 
|  7/7/2020 上午 11:34:20  |  湿度  |  22  | 
|  7/7/2020 上午 10:32:20  |  湿度  |  29  | 
|  7/7/2020 上午 10:31:22  |  温度  |  22  | 
|  7/7/2020 上午 9:30:57  |  湿度  |  33  | 
|  7/7/2020 上午 9:30:05  |  温度  |  19  | 

以下是添加值为“3”的限制转换后的结果：


| 时间 | 指标 | 值 | 
| --- | --- | --- | 
|  7/7/2020 上午 11:34:20  |  温度  |  25  | 
|  7/7/2020 上午 11:34:20  |  湿度  |  22  | 
|  7/7/2020 上午 10:32:20  |  湿度  |  29  | 