跳到主要内容
跳到主要内容

数组函数

empty

检查输入数组是否为空。

语法

如果数组不包含任何元素,则认为该数组为空。

备注

可以通过启用 optimize_functions_to_subcolumns 设置来优化。若 optimize_functions_to_subcolumns = 1,函数只读取 size0 子列,而不是读取和处理整个数组列。查询 SELECT empty(arr) FROM TABLE; 转换为 SELECT arr.size0 = 0 FROM TABLE;

该函数同样适用于 字符串UUID

参数

  • [x] — 输入数组。 Array

返回值

  • 对于空数组返回 1,对于非空数组返回 0UInt8

示例

查询:

结果:

notEmpty

检查输入数组是否非空。

语法

如果数组至少包含一个元素,则认为该数组为非空。

备注

可以通过启用 optimize_functions_to_subcolumns 设置来优化。若 optimize_functions_to_subcolumns = 1,该函数只读取 size0 子列,而不是读取和处理整个数组列。查询 SELECT notEmpty(arr) FROM table 转换为 SELECT arr.size0 != 0 FROM TABLE

该函数同样适用于 字符串UUID

参数

  • [x] — 输入数组。 Array

返回值

  • 对于非空数组返回 1,对于空数组返回 0UInt8

示例

查询:

结果:

length

返回数组中的项目数量。 结果类型为 UInt64。 该函数同样适用于字符串。

可以通过启用 optimize_functions_to_subcolumns 设置来优化。若 optimize_functions_to_subcolumns = 1,则函数只读取 size0 子列,而不是读取和处理整个数组列。查询 SELECT length(arr) FROM table 转换为 SELECT arr.size0 FROM TABLE

别名: OCTET_LENGTH

emptyArrayUInt8

返回一个空的 UInt8 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

结果:

emptyArrayUInt16

返回一个空的 UInt16 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

结果:

emptyArrayUInt32

返回一个空的 UInt32 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

结果:

emptyArrayUInt64

返回一个空的 UInt64 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

结果:

emptyArrayInt8

返回一个空的 Int8 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

结果:

emptyArrayInt16

返回一个空的 Int16 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

结果:

emptyArrayInt32

返回一个空的 Int32 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

结果:

emptyArrayInt64

返回一个空的 Int64 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

结果:

emptyArrayFloat32

返回一个空的 Float32 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

结果:

emptyArrayFloat64

返回一个空的 Float64 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

结果:

emptyArrayDate

返回一个空的 Date 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

emptyArrayDateTime

返回一个空的 DateTime 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

结果:

emptyArrayString

返回一个空的 String 数组。

语法

参数

无。

返回值

一个空数组。

示例

查询:

结果:

emptyArrayToSingle

接受一个空数组并返回一个等于默认值的单元素数组。

range(end), range([start, ] end [, step])

返回从 startend - 1 的数字数组,步长为 step。支持的类型有 UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64

语法

参数

  • start — 数组的第一个元素。可选,如果使用了 step 则必需。 默认值:0。
  • end — 构造数组之前的数字。必需。
  • step — 确定数组中每个元素之间的增量步长。可选。 默认值:1。

返回值

  • startend - 1 的数字数组,步长为 step

实现细节

  • 所有参数 startendstep 必须为以下数据类型:UInt8UInt16UInt32UInt64Int8Int16Int32Int64,以及返回数组中元素的类型是所有参数的超类型。
  • 如果查询结果包含的数组总长度超过了 function_range_max_elements_in_block 设置指定的元素数量,将抛出异常。
  • 如果任何参数具有 Nullable(Nothing) 类型,则返回 Null。如果任何参数具有 Null 值 (Nullable(T) 类型),将抛出异常。

示例

查询:

结果:

array(x1, ...), operator [x1, ...]

从函数参数创建一个数组。 参数必须是常量且具有最小的公共类型。必须至少传递一个参数,因为否则不清楚要创建哪种类型的数组。也就是说,您不能使用此函数创建一个空数组(要做到这一点,请使用上面描述的 'emptyArray*' 函数)。 返回 'Array(T)' 类型的结果,其中 'T' 是所传参数的最小公共类型。

arrayWithConstant(length, elem)

创建一个长度为 length 的数组,填充常量 elem

arrayConcat

将作为参数传递的数组组合在一起。

参数

  • arrays – 任意数量的 Array 类型的参数。

示例

arrayElement(arr, n), operator arr[n]

从数组 arr 中获取索引为 n 的元素。 n 必须是任何整数类型。 数组中的索引从一开始。

支持负索引。在这种情况下,它选择从末尾开始编号的相应元素。例如,arr[-1] 是数组中的最后一项。

如果索引超出了数组的边界,则返回一些默认值(数字为 0,字符串为空字符串等),但是对于非常量数组和常量索引为 0 的情况(在这种情况下将出现错误 Array indices are 1-based)除外。

has(arr, elem)

检查数组 'arr' 是否包含元素 'elem'。 如果元素不在数组中返回 0,若在则返回 1。

NULL 被处理为一个值。

arrayElementOrNull(arr, n)

从数组 arr 中获取索引为 n 的元素。 n 必须是任何整数类型。 数组中的索引从一开始。

支持负索引。在这种情况下,它选择从末尾开始编号的相应元素。例如,arr[-1] 是数组中的最后一项。

如果索引超出了数组的边界,则返回 NULL,而不是默认值。

示例

hasAll

检查一个数组是否是另一个数组的子集。

参数

  • set – 具有元素集合的任意类型数组。
  • subset – 具有与 set 共享一个共同超类型的任意类型数组,包含需要测试是否为 set 的子集的元素。

返回值

  • 如果 set 包含 subset 中的所有元素则返回 1
  • 否则返回 0

如果集合和子集元素没有共享一个共同的超类型,则引发异常 NO_COMMON_TYPE

特殊属性

  • 空数组是任何数组的子集。
  • Null 被处理为一个值。
  • 两个数组中的值的顺序无关紧要。

示例

SELECT hasAll([], []) 返回 1。

SELECT hasAll([1, Null], [Null]) 返回 1。

SELECT hasAll([1.0, 2, 3, 4], [1, 3]) 返回 1。

SELECT hasAll(['a', 'b'], ['a']) 返回 1。

SELECT hasAll([1], ['a']) 引发 NO_COMMON_TYPE 异常。

SELECT hasAll([[1, 2], [3, 4]], [[1, 2], [3, 5]]) 返回 0。

hasAny

检查两个数组是否有某些元素的交集。

参数

  • array1 – 具有元素集合的任意类型数组。
  • array2 – 具有与 array1 共享一个共同超类型的任意类型数组。

返回值

  • 如果 array1array2 至少有一个相同的元素则返回 1
  • 否则返回 0

如果 array1array2 的元素没有共享一个共同超类型,则引发异常 NO_COMMON_TYPE

特殊属性

  • Null 被处理为一个值。
  • 两个数组中的值的顺序无关紧要。

示例

SELECT hasAny([1], []) 返回 0

SELECT hasAny([Null], [Null, 1]) 返回 1

SELECT hasAny([-128, 1., 512], [1]) 返回 1

SELECT hasAny([[1, 2], [3, 4]], ['a', 'c']) 引发一个 NO_COMMON_TYPE 异常。

SELECT hasAll([[1, 2], [3, 4]], [[1, 2], [1, 2]]) 返回 1

hasSubstr

检查数组2的所有元素是否以相同的确切顺序出现在数组1中。因此,该函数将返回 1,仅当且仅当 array1 = prefix + array2 + suffix

换句话说,这个函数将检查 array2 的所有元素是否包含在 array1 中,就像 hasAll 函数一样。此外,它还将检查这些元素在 array1array2 中的顺序是否一致。

例如:

  • hasSubstr([1,2,3,4], [2,3]) 返回 1。然而,hasSubstr([1,2,3,4], [3,2]) 将返回 0
  • hasSubstr([1,2,3,4], [1,2,3]) 返回 1。然而,hasSubstr([1,2,3,4], [1,2,4]) 将返回 0

参数

  • array1 – 具有元素集合的任意类型数组。
  • array2 – 具有元素集合的任意类型数组。

返回值

  • 如果 array1 包含 array2 则返回 1
  • 否则返回 0

如果 array1array2 的元素没有共享一个共同超类型,则引发异常 NO_COMMON_TYPE

特殊属性

  • 如果 array2 为空,则该函数将返回 1
  • Null 被处理为一个值。换句话说 hasSubstr([1, 2, NULL, 3, 4], [2,3]) 将返回 0。然而,hasSubstr([1, 2, NULL, 3, 4], [2,NULL,3]) 将返回 1
  • 两个数组中的值的顺序是重要的。

示例

SELECT hasSubstr([], []) 返回 1。

SELECT hasSubstr([1, Null], [Null]) 返回 1。

SELECT hasSubstr([1.0, 2, 3, 4], [1, 3]) 返回 0。

SELECT hasSubstr(['a', 'b'], ['a']) 返回 1。

SELECT hasSubstr(['a', 'b' , 'c'], ['a', 'b']) 返回 1。

SELECT hasSubstr(['a', 'b' , 'c'], ['a', 'c']) 返回 0。

SELECT hasSubstr([[1, 2], [3, 4], [5, 6]], [[1, 2], [3, 4]]) 返回 1。 i SELECT hasSubstr([1, 2, NULL, 3, 4], ['a']) 将引发 NO_COMMON_TYPE 异常。

indexOf(arr, x)

返回值为 'x' 的第一个元素的索引(从 1 开始),如果它在数组中。 如果数组不包含所搜索的值,则该函数返回 0。

示例:

设置为 NULL 的元素被视为正常值处理。

indexOfAssumeSorted(arr, x)

返回值为 'x' 的第一个元素的索引(从 1 开始),如果它在数组中。 如果数组不包含所搜索的值,则该函数返回 0。 假定数组按升序排列(即,该函数使用二分查找)。 如果数组未排序,则结果是未定义的。 如果内部数组的类型为 Nullable,则将调用函数 'indexOf'。

示例:

arrayCount([func,] arr1, ...)

返回 func(arr1[i], ..., arrN[i]) 返回非零的元素数量。如果未指定 func,则返回数组中非零元素的数量。

请注意,arrayCount 是一个 高阶函数。您可以将一个 lambda 函数作为第一个参数传递给它。

arrayDotProduct

返回两个数组的点积。

语法

别名: scalarProduct, dotProduct

参数

  • vector1: 第一个向量。 ArrayTuple 的数值。
  • vector2: 第二个向量。 ArrayTuple 的数值。
备注

两个向量的大小必须相等。数组和元组也可以包含混合元素类型。

返回值

  • 两个向量的点积。 Numeric
备注

返回类型由参数类型决定。如果数组或元组包含混合元素类型,则结果类型为超类型。

示例

查询:

结果:

查询:

结果:

countEqual(arr, x)

返回数组中等于 x 的元素数量。等同于 arrayCount (elem -> elem = x, arr)。

NULL 元素被视为单独的值。

示例:

arrayEnumerate(arr)

返回数组 [1, 2, 3, ..., length (arr) ]

此函数通常与 ARRAY JOIN 一起使用。它允许对每个数组进行计数,仅在应用 ARRAY JOIN 后计数一次。例如:

在这个例子中,Reaches 是转换后的数量(在应用 ARRAY JOIN 后收到的字符串),而 Hits 是页面浏览量(在应用 ARRAY JOIN 之前的字符串)。在此特定情况下,您也可以以更简单的方式获得相同的结果:

该函数也可以在高阶函数中使用。例如,您可以使用它来获取与特定条件匹配的元素的数组索引。

arrayEnumerateUniq

返回一个与源数组相同大小的数组,指示每个元素在具有相同值的元素中的位置。 例如: arrayEnumerateUniq([10, 20, 10, 30]) = [1, 1, 2, 1]。

该函数在使用 ARRAY JOIN 和数组元素聚合时很有用。 示例:

在这个例子中,每个目标 ID 都计算了转换的数量(在 Goals 嵌套数据结构中的每个元素是达到的目标,我们称之为转换)和会话的数量。在没有使用 ARRAY JOIN 的情况下,我们会将会话的数量计算为 sum(Sign)。但在这种情况下,行被嵌套 Goals 结构乘以,因此为了在此之后计算每个会话,我们应用了 arrayEnumerateUniq(Goals.ID) 函数的值的条件。

arrayEnumerateUniq 函数可以将多个相同大小的数组作为参数传递。在这种情况下,唯一性将被认为是所有数组中相同位置的元素的元组。

在使用包含嵌套数据结构的 ARRAY JOIN 和进一步聚合多个元素时,这是必要的。

arrayEnumerateUniqRanked

返回一个与源数组相同大小的数组,指示每个元素在具有相同值的元素中的位置。它允许对多维数组进行枚举,并能够指定深入查找数组的程度。

语法

参数

  • clear_depth: 在指定级别单独枚举元素。正整数(Integer),小于或等于 max_arr_depth
  • arr: 要枚举的 N 维数组。 Array
  • max_array_depth: 最大有效深度。正整数(Integer),小于或等于 arr 的深度。

示例

设置 clear_depth=1max_array_depth=1arrayEnumerateUniqRanked 的结果与 arrayEnumerateUniq 对同一数组的结果相同。

查询:

结果:

在这个例子中,arrayEnumerateUniqRanked 用于获取一个数组,指示每个多维数组的元素在相同值的元素中的位置。对于传入的数组的第一行[1,2,3],对应结果为[1,1,1],表示这是 123 第一次被遇到。对于提供的数组第二行[2,2,1],对应结果为[2,3,3],表示 2 被遇到第二次和第三次,而 1 被遇到第二次。同样,对于提供的数组第三行[3],对应的结果为[2],表明 3 被遇到第二次。

查询:

结果:

更改 clear_depth=2,结果为每行分别枚举元素。

查询:

结果:

arrayPopBack

从数组中移除最后一个项。

参数

  • array – 数组。

示例

arrayPopFront

从数组中移除第一个项。

参数

  • array – 数组。

示例

arrayPushBack

向数组末尾添加一个项。

参数

  • array – 数组。
  • single_value – 单个值。只有数字可以添加到数字数组中,只有字符串可以添加到字符串数组中。在添加数字时,ClickHouse 会自动为 single_value 设置数组的数据类型。有关 ClickHouse 中数据类型的信息,请参见 "数据类型"。可以是 NULL。该函数向数组中添加 NULL 元素,并且数组元素类型转换为 Nullable

示例

arrayPushFront

向数组开头添加一个元素。

参数

  • array – 数组。
  • single_value – 单个值。只有数字可以添加到数字数组中,只有字符串可以添加到字符串数组中。在添加数字时,ClickHouse 会自动为 single_value 设置数组的数据类型。有关 ClickHouse 中数据类型的信息,请参见 "数据类型"。可以是 NULL。该函数向数组中添加 NULL 元素,并且数组元素类型转换为 Nullable

示例

arrayResize

更改数组的长度。

参数:

  • array — 数组。
  • size — 数组所需的长度。
    • 如果 size 小于数组的原始大小,则数组将从右侧截断。
  • 如果 size 大于数组的初始大小,则数组将用 extender 值或该数组项数据类型的默认值向右扩展。
  • extender — 扩展数组的值。可以是 NULL

返回值:

长度为 size 的数组。

调用示例

arraySlice

返回数组的切片。

参数

  • array – 数据数组。
  • offset – 从数组边缘的缩进值。正值表示从左侧偏移,负值表示从右侧偏移。数组项目的编号从 1 开始。
  • length – 所需切片的长度。如果指定负值,则该函数返回开放切片 [offset, array_length - length]。如果省略该值,则函数返回切片 [offset, the_end_of_array]

示例

设置为 NULL 的数组元素被视为正常值处理。

arrayShingles

生成一组 "shingles" 数组,即具有指定长度的输入数组的连续子数组。

语法

参数

  • array — 输入数组 Array
  • length — 每个 shingle 的长度。

返回值

  • 生成的 shingle 数组。 Array

示例

查询:

结果:

arraySort([func,] arr, ...)

arr 数组的元素按升序排序。如果指定了 func 函数,则排序顺序由应用于数组元素的 func 函数的结果决定。如果 func 接受多个参数,则 arraySort 函数将传入多个数组,这些数组将对应于 func 的参数。详细示例在 arraySort 描述的末尾列出。

整数值排序的示例:

字符串值排序的示例:

考虑以下 NULLNaNInf 值的排序顺序:

  • -Inf 值在数组的最前面。
  • NULL 值在数组的最后面。
  • NaN 值在 NULL 之前。
  • Inf 值在 NaN 之前。

注意 arraySort 是一个 高阶函数。您可以将 lambda 函数作为第一个参数传递给它。在这种情况下,排序顺序由应用于数组元素的 lambda 函数的结果决定。

让我们考虑以下示例:

对于源数组的每个元素,lambda 函数返回排序键,即 [1 –> -1, 2 –> -2, 3 –> -3]。由于 arraySort 函数以升序对键进行排序,因此结果为 [3, 2, 1]。因此,(x) –> -x lambda 函数在排序中设置了 降序

lambda 函数可以接受多个参数。在这种情况下,您需要将 arraySort 函数传递多个相同长度的数组,这些数组将对应于 lambda 函数的参数。结果数组将由第一个输入数组的元素组成;下一个输入数组的元素指定排序键。例如:

在这里,传递到第二个数组中的元素([2, 1])定义了来自源数组(['hello', 'world'])的相应元素的排序键,即 ['hello' –> 2, 'world' –> 1]。由于 lambda 函数未使用 x,源数组的实际值不会影响结果的顺序。因此,'hello' 将是结果中的第二个元素,而 'world' 将是第一个。

其他示例在下面显示。

备注

为了提高排序效率,使用 Schwartzian 变换

arrayPartialSort([func,] limit, arr, ...)

arraySort 相同,额外的 limit 参数允许部分排序。返回一个与原始数组大小相同的数组,其中范围为 [1..limit] 的元素按升序排序。其余元素 (limit..N] 应包含未指定顺序的元素。

arrayReverseSort

arr 数组的元素按降序排序。如果指定了 func 函数,则 arr 根据应用于数组元素的 func 函数的结果进行排序,然后对排序后的数组进行反转。如果 func 接受多个参数,则 arrayReverseSort 函数将传入多个数组,这些数组将对应于 func 的参数。详细示例在 arrayReverseSort 描述的末尾列出。

语法

整数值排序的示例:

字符串值排序的示例:

考虑以下 NULLNaNInf 值的排序顺序:

  • Inf 值在数组的最前面。
  • NULL 值在数组的最后面。
  • NaN 值在 NULL 之前。
  • -Inf 值在 NaN 之前。

注意 arrayReverseSort 是一个 高阶函数。您可以将 lambda 函数作为第一个参数传递给它。示例如下所示。

数组的排序方式如下:

  1. 首先,源数组([1, 2, 3])根据应用于数组元素的 lambda 函数的结果进行排序。结果是数组 [3, 2, 1]。
  2. 在上一步中获得的数组被反转。因此,最终结果为 [1, 2, 3]。

lambda 函数可以接受多个参数。在这种情况下,您需要将 arrayReverseSort 函数传递多个相同长度的数组,这些数组将对应于 lambda 函数的参数。结果数组将由第一个输入数组的元素组成;下一个输入数组的元素指定排序键。例如:

在这个例子中,数组的排序方式如下:

  1. 首先,源数组(['hello', 'world'])根据应用于数组元素的 lambda 函数的结果进行排序。传递到第二个数组中的元素([2, 1])定义了来自源数组的相应元素的排序键。结果是数组 ['world', 'hello']。
  2. 在上一步中排序的数组被反转。因此,最终结果是 ['hello', 'world']。

其他示例在下面显示。

arrayPartialReverseSort([func,] limit, arr, ...)

arrayReverseSort 相同,额外的 limit 参数允许部分排序。返回一个与原始数组大小相同的数组,其中范围 [1..limit] 的元素按降序排序。其余元素 (limit..N] 应包含未指定顺序的元素。

arrayShuffle

返回一个与原始数组大小相同的数组,其中包含 shuffled 顺序的元素。元素的重新排序方式使得这些元素的每种可能排列具有相等的出现概率。

语法

参数

  • arr:要部分洗牌的数组。 Array
  • seed(可选):随机数生成时使用的种子。如果未提供,则使用随机生成。 UInt 或 Int

返回值

  • 带有洗牌元素的数组。

实现细节

备注

此函数不会对常量进行物化。

示例

在这个例子中,arrayShuffle 在未提供 seed 的情况下使用,因此将随机生成一个 seed

查询:

注意:在使用 ClickHouse Fiddle 时,由于该函数的随机性,确切的响应可能会有所不同。

结果:

在这个例子中,arrayShuffle 提供了一个 seed,从而产生稳定的结果。

查询:

结果:

arrayPartialShuffle

给定一个基数为 N 的输入数组,返回一个大小为 N 的数组,其中范围 [1...limit] 的元素被洗牌,范围 (limit...n] 的其余元素未被洗牌。

语法

参数

  • arr:要部分洗牌的大小为 N 的数组。 Array
  • limit(可选):在范围 [1..N] 中限制元素交换的数量。UInt 或 Int
  • seed(可选):用于随机数生成的种子值。如果未提供,则使用随机生成。UInt 或 Int

返回值

  • 带有部分洗牌元素的数组。

实现细节

备注

此函数不会对常量进行物化。

limit 的值应在范围 [1..N] 内。超出该范围的值等效于执行完整的 arrayShuffle

示例

注意:在使用 ClickHouse Fiddle 时,由于该函数的随机性,确切的响应可能会有所不同。

查询:

结果:

元素的顺序保持不变([2,3,4,5], [7,8,9,10]),除了两个被洗牌的元素 [1, 6]。未提供 seed,所以函数随机选择了。

在这个例子中,limit 增加到 2 并提供了一个 seed 值。顺序

查询:

元素的顺序保持不变([4, 5, 6, 7, 8], [10]),除了四个被洗牌的元素 [1, 2, 3, 9]

结果:

arrayUniq(arr, ...)

如果传入一个参数,则计算数组中不同元素的数量。如果传入多个参数,则计算多个数组中对应位置元素的不同元组的数量。

如果你想获得数组中的唯一项目列表,可以使用 arrayReduce('groupUniqArray', arr)。

arrayJoin(arr)

一个特殊函数。请参见 "ArrayJoin function" 部分。

arrayDifference

计算相邻数组元素之间的差异数组。结果数组的第一个元素将为 0,第二个 a[1] - a[0],第三个 a[2] - a[1],依此类推。结果数组中元素的类型由减法的类型推断规则决定(例如 UInt8 - UInt8 = Int16)。

语法

参数

返回值

返回相邻数组元素之间的差异数组。 UInt*Int*Float*

示例

查询:

结果:

由于结果类型为 Int64 的溢出示例:

查询:

结果:

arrayDistinct

获取数组,返回仅包含不同元素的数组。

语法

参数

返回值

返回仅包含不同元素的数组。

示例

查询:

结果:

arrayEnumerateDense

返回一个与源数组大小相同的数组,指示每个元素在源数组中首次出现的位置。

语法

示例

查询:

结果:

arrayEnumerateDenseRanked

返回一个与源数组大小相同的数组,指示每个元素在源数组中首次出现的位置。它允许对多维数组进行枚举,并能够指定查找内部数组的深度。

语法

参数

  • clear_depth:分别在指定层次的清晰枚举。正整数 Integer,小于或等于 max_arr_depth
  • arr:要枚举的 N 维数组。Array
  • max_array_depth:最大有效深度。正整数 Integer,小于或等于 arr 的深度。

示例

clear_depth=1max_array_depth=1 的情况下,结果与 arrayEnumerateDense 的结果相同。

查询:

结果:

在这个示例中,arrayEnumerateDenseRanked 用于获取一个数组,指示对于多维数组的每个元素,同样值的元素的位置。对于传递数组的第一行 [10,10,30,20],结果的对应第一行是 [1,1,2,3],指示 10 在位置 1 和 2 中是遇到的第一个数字,30 是第三个数字,20 是第四个数字。对于第二行 [40, 50, 10, 30],结果的对应第二行是 [4,5,1,2],指出 4050 分别是该行中遇到的第四和第五个数字,而另一个 10(遇到的第一个数字)在位置 3 中,30(遇到的第二个数字)在最后的位置。

查询:

结果:

clear_depth=2 更改将导致每一行新的单独枚举。

查询:

结果:

arrayUnion

接受多个数组并返回一个数组,该数组包含所有在一个或多个源数组中存在的元素。结果仅包含唯一值。

语法

参数

该函数可以接受任意数量的不同类型数组。

返回值

  • 由源数组中的不同元素组成的 Array

示例

查询:

结果:

arrayIntersect

接受多个数组并返回一个包含所有源数组中存在的元素的数组。结果仅包含唯一值。

语法

参数

该函数可以接受任意数量的不同类型数组。

返回值

  • 包含所有源数组中存在的不同元素的 Array

示例

查询:

结果:

arraySymmetricDifference

接受多个数组并返回一个包含在所有源数组中不存在的元素的数组。结果仅包含唯一值。

备注

两个以上集合的对称差异在数学上定义为出现奇数次的所有输入元素的集合。相反,函数 arraySymmetricDifference 仅返回所有输入集合中不存在的输入元素的集合。

语法

参数

该函数可以接受任意数量的不同类型数组。

返回值

  • 包含所有源数组中不存在的不同元素的 Array

示例

查询:

结果:

arrayJaccardIndex

返回两个数组的 Jaccard 指数

示例

查询:

结果:

arrayReduce

对数组元素应用聚合函数并返回其结果。聚合函数的名称作为字符串传递,使用单引号 'max''sum'。当使用参数聚合函数时,参数放在函数名称后面,用括号标示 'uniqUpTo(6)'

语法

参数

  • agg_func — 应该是常量字符串 string 的聚合函数的名称。
  • arr — 作为聚合函数参数的任意数量的 array 类型列。

返回值

示例

查询:

结果:

如果聚合函数接受多个参数,则必须对多个相同大小的数组应用此函数。

查询:

结果:

带有参数聚合函数的示例:

查询:

结果:

另见

arrayReduceInRanges

将聚合函数应用于给定范围的数组元素,并返回一个包含每个范围对应结果的数组。该函数将返回与多个 arrayReduce(agg_func, arraySlice(arr1, index, length), ...) 相同的结果。

语法

参数

  • agg_func — 应该是常量字符串 string 的聚合函数的名称。
  • ranges — 所需聚合的范围,应该是包含每个范围的索引和长度的 arraytuples
  • arr — 作为聚合函数参数的任意数量的 Array 类型列。

返回值

  • 包含指定范围的聚合函数结果的数组。 Array

示例

查询:

结果:

arrayFold

将 lambda 函数应用于一个或多个等大小的数组,并在一个累加器中收集结果。

语法

示例

查询:

结果:

带有 Fibonacci 序列的示例

另见

arrayReverse

返回一个与原始数组大小相同的数组,其中包含元素的反向顺序。

语法

示例:

reverse(arr)

"arrayReverse" 的同义词。

arrayFlatten

将数组数组转换为扁平数组。

函数:

  • 适用于任何深度的嵌套数组。
  • 不更改已是扁平的数组。

扁平数组包含来自所有源数组的所有元素。

语法

别名:flatten

参数

  • array_of_arraysArray 的数组。例如,[[1,2,3], [4,5]]

示例

arrayCompact

从数组中删除连续重复的元素。结果值的顺序由源数组中的顺序决定。

语法

参数

arr — 要检查的 array

返回值

没有重复的数组。 Array

示例

查询:

结果:

arrayZip

将多个数组组合成一个数组。结果数组包含源数组中对应元素按照参数列出的顺序分组为元组。

语法

参数

该函数可以接受任意数量的不同类型数组。所有输入数组必须具有相同的大小。

返回值

  • 将源数组中的元素分组为 tuples 的数组。元组中的数据类型与输入数组的类型相同,并且与输入数组传递的顺序相同。 Array

示例

查询:

结果:

arrayZipUnaligned

将多个数组组合成一个数组,允许不对齐的数组。结果数组中的元素是源数组中对应元素按参数列出的顺序分组为元组。

语法

参数

该函数可以接受任意数量的不同类型数组。

返回值

  • 将源数组中的元素分组为 tuples 的数组。元组中的数据类型与输入数组的类型相同,并且与输入数组传递的顺序相同。 Array。如果数组的大小不同,则较短的数组将用 null 值填充。

示例

查询:

结果:

arrayROCAUC

计算接收者操作特征(ROC)曲线下面积。 ROC 曲线是通过绘制真实正率(TPR)与假正率(FPR)在所有阈值上的关系而创建的。 结果值的范围从 0 到 1,较高的值表示模型性能更好。 ROC AUC(也称为简单的 AUC)是机器学习中的一个概念。 有关更多详细信息,请参见 hereherehere

语法

别名:arrayAUC

参数

  • arr_scores — 预测模型给出的分数。 ArrayIntegersFloats
  • arr_labels — 样本的标签,通常正样本为 1,负样本为 0。 ArrayIntegersEnums
  • scale — 决定是否返回归一化区域。如果为 false,则返回 TP(真正例)x FP(假正例)曲线下的区域。默认值:true。 Bool。可选。
  • arr_partial_offsets — 用于计算 ROC 曲线下面积的部分区域(相当于 ROC 空间的垂直带)的四个非负整数数组,而不是整个 AUC。此选项有助于 ROC AUC 的分布式计算。数组必须包含以下元素 [higher_partitions_tp, higher_partitions_fp, total_positives, total_negatives]。 Array 的非负 Integers。可选。
    • higher_partitions_tp:在分数较高的分区中正标签的数量。
    • higher_partitions_fp:在分数较高的分区中负标签的数量。
    • total_positives:整个数据集中正样本的总数。
    • total_negatives:整个数据集中负样本的总数。
备注

当使用 arr_partial_offsets 时,arr_scoresarr_labels 应仅为整个数据集的一个分区,包含一个分数区间的数据。 数据集应被划分为连续的分区,每个分区包含其分数落在特定范围内的数据子集。 例如:

  • 一个分区可以包含所有分数在 [0, 0.5) 范围内。
  • 另一个分区可以包含分数在 [0.5, 1.0] 范围内。

返回值

返回 ROC 曲线下面积。 Float64

示例

查询:

结果:

arrayAUCPR

计算精确率-召回率 (PR) 曲线下的面积。
精确率-召回率曲线是通过在所有阈值下将精确率绘制在 y 轴上、召回率绘制在 x 轴上创建的。
结果值的范围从 0 到 1,值越高表示模型性能越好。
PR AUC 对于不平衡数据集特别有用,与 ROC AUC 相比,在这些情况下提供了更清晰的性能比较。
有关更多详细信息,请参见 这里这里这里

语法

别名: arrayPRAUC

参数

  • arr_scores — 模型提供的分数。 数组整数浮点数
  • arr_labels — 样本的标签,通常对于正样本为 1,对于负样本为 0。 数组整数枚举
  • arr_partial_offsets — 可选。用于计算 PR 曲线下的部分区域的三个非负整数的 数组(相当于 PR 空间的垂直带),而不是整个 AUC。此选项对于 PR AUC 的分布式计算很有用。数组必须包含以下元素 [higher_partitions_tp, higher_partitions_fp, total_positives]。可选的非负 整数 的数组。
    • higher_partitions_tp: 高分片中的正标签数量。
    • higher_partitions_fp: 高分片中的负标签数量。
    • total_positives: 整个数据集中的正样本总数。
备注

使用 arr_partial_offsets 时,arr_scoresarr_labels 应仅为整个数据集的一部分,包含一个分数区间。
数据集应划分为连续分区,每个分区包含分数在特定范围内的数据子集。
例如:

  • 一个分区可以包含所有分数在 [0, 0.5) 范围内。
  • 另一个分区可以包含分数在 [0.5, 1.0] 范围内。

返回值

返回精确率-召回率 (PR) 曲线下的面积。 Float64

示例

查询:

结果:

arrayMap(func, arr1, ...)

通过对每个元素应用 func(arr1[i], ..., arrN[i]) 从原始数组中返回一个数组。数组 arr1 ... arrN 必须具有相同数量的元素。

示例:

以下示例显示如何从不同数组创建元素的元组:

注意 arrayMap 是一个 高阶函数。您必须将一个 lambda 函数作为第一个参数传递给它,且该参数不可省略。

arrayFilter(func, arr1, ...)

返回一个仅包含 arr1func(arr1[i], ..., arrN[i]) 返回非零元素的数组。

示例:

注意 arrayFilter 是一个 高阶函数。您必须将一个 lambda 函数作为第一个参数传递给它,且该参数不可省略。

arrayFill(func, arr1, ...)

从第一个元素到最后一个元素扫描 arr1,如果 func(arr1[i], ..., arrN[i]) 返回 0,则用 arr1[i - 1] 替换 arr1[i]arr1 的第一个元素不会被替换。

示例:

注意 arrayFill 是一个 高阶函数。您必须将一个 lambda 函数作为第一个参数传递给它,且该参数不可省略。

arrayReverseFill(func, arr1, ...)

从最后一个元素到第一个元素扫描 arr1,如果 func(arr1[i], ..., arrN[i]) 返回 0,则用 arr1[i + 1] 替换 arr1[i]arr1 的最后一个元素不会被替换。

示例:

注意 arrayReverseFill 是一个 高阶函数。您必须将一个 lambda 函数作为第一个参数传递给它,且该参数不可省略。

arraySplit(func, arr1, ...)

arr1 拆分为多个数组。当 func(arr1[i], ..., arrN[i]) 返回非零元素时,数组将在元素左侧拆分。数组在第一个元素之前不会被拆分。

示例:

注意 arraySplit 是一个 高阶函数。您必须将一个 lambda 函数作为第一个参数传递给它,且该参数不可省略。

arrayReverseSplit(func, arr1, ...)

arr1 拆分为多个数组。当 func(arr1[i], ..., arrN[i]) 返回非零元素时,数组将在元素右侧拆分。数组在最后一个元素之后不会被拆分。

示例:

注意 arrayReverseSplit 是一个 高阶函数。您必须将一个 lambda 函数作为第一个参数传递给它,且该参数不可省略。

arrayExists([func,] arr1, ...)

如果 arr 中至少有一个元素使得 func(arr1[i], ..., arrN[i]) 返回非零,则返回 1。否则,返回 0。

注意 arrayExists 是一个 高阶函数。您可以将一个 lambda 函数作为第一个参数传递给它。

arrayAll([func,] arr1, ...)

如果 func(arr1[i], ..., arrN[i]) 对数组中所有元素返回非零,则返回 1。否则,返回 0。

注意 arrayAll 是一个 高阶函数。您可以将一个 lambda 函数作为第一个参数传递给它。

arrayFirst(func, arr1, ...)

返回 arr1 数组中第一个使得 func(arr1[i], ..., arrN[i]) 返回非零的元素。

arrayFirstOrNull

返回 arr1 数组中第一个使得 func(arr1[i], ..., arrN[i]) 返回非零的元素,否则返回 NULL

语法

参数

返回值

  • 在传入数组中的第一个元素。
  • 否则,返回 NULL

实现细节

注意 arrayFirstOrNull 是一个 高阶函数。您必须将一个 lambda 函数作为第一个参数传递给它,且该参数不可省略。

示例

查询:

结果:

查询:

结果:

查询:

结果:

arrayLast(func, arr1, ...)

返回 arr1 数组中第一个使得 func(arr1[i], ..., arrN[i]) 返回非零的最后一个元素。

注意 arrayLast 是一个 高阶函数。您必须将一个 lambda 函数作为第一个参数传递给它,且该参数不可省略。

arrayLastOrNull

返回 arr1 数组中第一个使得 func(arr1[i], ..., arrN[i]) 返回非零的最后一个元素,否则返回 NULL

语法

参数

返回值

  • 在传入数组中的最后一个元素。
  • 否则,返回 NULL

实现细节

注意 arrayLastOrNull 是一个 高阶函数。您必须将一个 lambda 函数作为第一个参数传递给它,且该参数不可省略。

示例

查询:

结果:

查询:

结果:

arrayFirstIndex(func, arr1, ...)

返回 arr1 数组中第一个使得 func(arr1[i], ..., arrN[i]) 返回非零的元素的索引。

注意 arrayFirstIndex 是一个 高阶函数。您必须将一个 lambda 函数作为第一个参数传递给它,且该参数不可省略。

arrayLastIndex(func, arr1, ...)

返回 arr1 数组中最后一个使得 func(arr1[i], ..., arrN[i]) 返回非零的元素的索引。

注意 arrayLastIndex 是一个 高阶函数。您必须将一个 lambda 函数作为第一个参数传递给它,且该参数不可省略。

arrayMin

返回源数组中元素的最小值。

如果指定了 func 函数,则返回由此函数转换后的元素的最小值。

注意 arrayMin 是一个 高阶函数。您可以将一个 lambda 函数作为第一个参数传递给它。

语法

参数

返回值

  • 函数值的最小值(或数组的最小值)。
备注

如果指定了 func,则返回类型与 func 的返回值类型相匹配,否则与数组元素的类型相匹配。

示例

查询:

结果:

查询:

结果:

arrayMax

返回源数组中元素的最大值。

如果指定了 func 函数,则返回由此函数转换后的元素的最大值。

注意 arrayMax 是一个 高阶函数。您可以将一个 lambda 函数作为第一个参数传递给它。

语法

参数

返回值

  • 函数值的最大值(或数组的最大值)。
备注

如果指定了 func,则返回类型与 func 的返回值类型相匹配,否则与数组元素的类型相匹配。

示例

查询:

结果:

查询:

结果:

arraySum

返回源数组中元素的总和。

如果指定了 func 函数,则返回由此函数转换后的元素的总和。

注意 arraySum 是一个 高阶函数。您可以将一个 lambda 函数作为第一个参数传递给它。

语法

参数

返回值

  • 函数值的总和(或数组的总和)。
备注

返回类型:

  • 对于源数组中的十进制数(或对于转换值,如果指定了 func) — Decimal128
  • 对于浮点数 — Float64
  • 对于无符号数字 — UInt64
  • 对于有符号数字 — Int64

示例

查询:

结果:

查询:

结果:

arrayAvg

返回源数组中元素的平均值。

如果指定了 func 函数,则返回由此函数转换后的元素的平均值。

注意 arrayAvg 是一个 高阶函数。您可以将一个 lambda 函数作为第一个参数传递给它。

语法

参数

返回值

  • 函数值的平均值(或数组的平均值)。 Float64

示例

查询:

结果:

查询:

结果:

arrayCumSum([func,] arr1, ...)

返回源数组 arr1 中元素的部分(运行)和的数组。如果指定了 func,则通过将 func 应用到 arr1arr2、...、arrN 计算和,即 func(arr1[i], ..., arrN[i])

语法

参数

返回值

  • 返回源数组中元素的部分和的数组。 UInt*Int*Float*

示例:

注意 arrayCumSum 是一个 高阶函数。您可以将一个 lambda 函数作为第一个参数传递给它。

arrayCumSumNonNegative([func,] arr1, ...)

arrayCumSum 相同,返回源数组中元素的部分(运行)和的数组。如果指定了 func,则通过将 func 应用到 arr1arr2、...、arrN 计算和,即 func(arr1[i], ..., arrN[i])。与 arrayCumSum 不同的是,如果当前的运行总和小于 0,则用 0 替换。

语法

参数

返回值

  • 返回源数组中的非负部分和的数组。 UInt*Int*Float*

注意 arraySumNonNegative 是一个 高阶函数。您可以将一个 lambda 函数作为第一个参数传递给它。

arrayProduct

数组 的元素进行乘法运算。

语法

参数

返回值

  • 数组元素的乘积。 Float64

示例

查询:

结果:

查询:

返回值类型始终为 Float64。结果:

arrayRotateLeft

数组 向左旋转指定数量的元素。
如果元素的数量为负,则数组向右旋转。

语法

参数

  • arr数组
  • n — 旋转的元素数量。

返回值

  • 向左旋转指定数量元素的数组。 数组

示例

查询:

结果:

查询:

结果:

查询:

结果:

arrayRotateRight

数组 向右旋转指定数量的元素。
如果元素的数量为负,则数组向左旋转。

语法

参数

  • arr数组
  • n — 旋转的元素数量。

返回值

  • 向右旋转指定数量元素的数组。 数组

示例

查询:

结果:

查询:

结果:

查询:

结果:

arrayShiftLeft

数组 向左移动指定数量的元素。
新元素使用提供的参数或数组元素类型的默认值填充。
如果元素的数量为负,则数组向右移动。

语法

参数

  • arr数组
  • n — 移动的元素数量。
  • default — 可选。新元素的默认值。

返回值

  • 向左移动指定数量元素的数组。 数组

示例

查询:

结果:

查询:

结果:

查询:

结果:

查询:

结果:

查询:

结果:

arrayShiftRight

数组 向右移动指定数量的元素。
新元素使用提供的参数或数组元素类型的默认值填充。
如果元素的数量为负,则数组向左移动。

语法

参数

  • arr数组
  • n — 移动的元素数量。
  • default — 可选。新元素的默认值。

返回值

  • 向右移动指定数量元素的数组。 数组

示例

查询:

结果:

查询:

结果:

查询:

结果:

查询:

结果:

查询:

结果:

arrayRandomSample

函数 arrayRandomSample 从输入数组返回一个包含 samples 个随机元素的子集。
如果 samples 超过输入数组的大小,则样本大小限制为数组的大小,即返回所有数组元素,但不保证其顺序。
该函数可以处理平面数组和嵌套数组。

语法

参数

  • arr — 要从中抽取元素的输入数组。 (Array(T))
  • samples — 要在随机样本中包含的元素数量 (UInt*)

返回值

  • 包含来自输入数组的随机元素样本的数组。 数组

示例

查询:

结果:

查询:

结果:

查询:

结果:

arrayNormalizedGini

计算规范化的基尼系数。

语法

参数

返回值

  • 包含预测值的基尼系数、规范化值的基尼系数和规范化基尼系数(即前两个基尼系数的比率)的元组。

示例

查询:

结果:

Distance functions

所有支持的函数在 距离函数文档 中有所描述。