这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

通过表达式聚合数据

您可以创建其中的一个或多个列由表达式定义的投影。表达式可以引用一个或多个锚表列。例如,下表包含两个整数列 ab

=> CREATE TABLE values (a INT, b INT);

您可以创建含表达式的投影,利用表达式将列 c 的值计算为 ab 的乘积:

=> CREATE PROJECTION values_product (a, b, c)
   AS SELECT a, b, a*b FROM values SEGMENTED BY HASH(a) ALL NODES KSAFE;

当您将数据加载到此投影中时,Vertica 会解析列 c 中的表达式 a*b。然后,您可以查询投影而不是锚表。Vertica 会返回预计算的数据并避免资源密集型计算产生的开销。

在投影中使用表达式还可以让您对表达式的计算结果的数据进行排序或分段,而不是对单个列值进行排序。

支持用户定义的标量函数

Vertica 将用户定义的标量函数 (UDSF) 视为类似于其他表达式。在每个加载操作中,UDSF 会被调用并返回其结果。Vertica 将这些结果存储在磁盘上,并在您直接查询投影时返回这些结果。

在以下示例中,投影 points_p1 指定了在将数据加载到锚表 points 时调用的 UDSF zorder。当数据加载到投影时,Vertica 将调用此函数,并存储其结果,以便在未来查询时能够快速访问。

=> CREATE TABLE points(point_id INTEGER, lat NUMERIC(12,9), long NUMERIC(12,9));

=> CREATE PROJECTION points_p1
     AS SELECT point_id, lat, long, zorder(lat, long) zorder FROM points
     ORDER BY zorder(lat, long) SEGMENTED BY hash(point_id) ALL NODES;

要求

  • 所有 ORDER BY 表达式必须位于 SELECT 列表。

  • 所有投影列必须经过命名。

限制

  • 如果在具有实时聚合投影的目标表上执行 MERGE 操作,则这些操作必须优化

  • 与实时聚合投影不同,Vertica 不会将含表达式的查询重定向到等效现有投影。

  • 投影表达式必须不可变,换而言之,它们必须始终返回相同的结果。例如,投影不能包括使用 TO CHAR(取决于区域设置)或 RANDOM(在每次调用时返回不同的结果)的表达式。

  • 投影表达式不能包括 Vertica 元函数,例如 ADVANCE_EPOCHANALYZE_STATISTICSEXPORT_TABLESSTART_REFRESH

1 - 通过表达式查询数据示例

以下示例使用了包含两个整数列 ab 的表:

=> CREATE TABLE values (a INT, b INT);

您可以创建含表达式的投影,利用表达式将列 c 的值计算为 ab 的乘积:

=> CREATE PROJECTION values_product (a, b, c)
   AS SELECT a, b, a*b FROM values SEGMENTED BY HASH(a) ALL NODES KSAFE;
=> COPY values FROM STDIN DELIMITER ',' DIRECT;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 3,11
>> 3,55
>> 8,9
>> 8,23
>> 16,41
>> 22,111
>> \.
=>

要查询此投影,请使用 Vertica 分配给此投影或其伙伴实例投影的名称。例如,以下查询针对之前定义的投影的不同实例,并且返回相同的结果:

=> SELECT * FROM values_product_b0;
=> SELECT * FROM values_product_b1;

以下示例查询了锚表:

=> SELECT * FROM values;
 a  |  b
----+-----
  3 |  11
  3 |  55
  8 |   9
  8 |  23
 16 |  41
 22 | 111

假设使用之前创建的投影,查询该投影会返回以下值:

VMart=> SELECT * FROM values_product_b0;
 a  |  b  | product
----+-----+---------
  3 |  11 |      33
  3 |  55 |     165
  8 |   9 |      72
  8 |  23 |     184
 16 |  41 |     656
 22 | 111 |    2442