在 ClickHouse 中,groupArray
函数用于将一组值聚合到一个数组中。这对于需要将多行数据合并成单个数组的场景非常有用。下面是一些关于 groupArray
的基本用法和示例。
基本用法
groupArray
函数的基本语法如下:
groupArray(expr)
expr
:要聚合的表达式,可以是列名或其他表达式。
示例
假设我们有一个包含用户购买记录的表 purchases
,表结构如下:
CREATE TABLE purchases (
user_id UInt32,
product_id UInt32,
purchase_date Date
) ENGINE = MergeTree()
ORDER BY (user_id, purchase_date);
插入一些示例数据:
INSERT INTO purchases (user_id, product_id, purchase_date) VALUES
(1, 101, '2023-10-01'),
(1, 102, '2023-10-02'),
(1, 103, '2023-10-03'),
(2, 201, '2023-10-01'),
(2, 202, '2023-10-02'),
(3, 301, '2023-10-01');
使用 groupArray
聚合产品 ID
假设我们想按用户 ID 聚合每个用户的购买产品 ID 列表:
SELECT user_id, groupArray(product_id) AS product_ids
FROM purchases
GROUP BY user_id;
输出:
┌─user_id─┬─product_ids──────────┐
│ 1 │ [101,102,103] │
│ 2 │ [201,202] │
│ 3 │ [301] │
└─────────┴──────────────────────┘
使用 groupArray
聚合购买日期
假设我们想按用户 ID 聚合每个用户的购买日期列表:
SELECT user_id, groupArray(purchase_date) AS purchase_dates
FROM purchases
GROUP BY user_id;
输出:
┌─user_id─┬─purchase_dates────────────────────┐
│ 1 │ ['2023-10-01','2023-10-02','2023-10-03'] │
│ 2 │ ['2023-10-01','2023-10-02'] │
│ 3 │ ['2023-10-01'] │
└─────────┴───────────────────────────────────────┘
使用 groupArray
聚合多个字段
假设我们想按用户 ID 聚合每个用户的购买产品 ID 和购买日期列表:
SELECT user_id, groupArray((product_id, purchase_date)) AS purchases
FROM purchases
GROUP BY user_id;
输出:
┌─user_id─┬─purchases──────────────────────────────────────────────────────┐
│ 1 │ [(101,'2023-10-01'),(102,'2023-10-02'),(103,'2023-10-03')] │
│ 2 │ [(201,'2023-10-01'),(202,'2023-10-02')] │
│ 3 │ [(301,'2023-10-01')] │
└─────────┴────────────────────────────────────────────────────────────────┘
控制数组大小
groupArray
还有一个变体 groupArray(N)
,可以限制数组的最大长度。例如,我们只保留每个用户最近的两次购买记录:
SELECT user_id, groupArray(2)(product_id) AS product_ids
FROM purchases
GROUP BY user_id;
输出:
┌─user_id─┬─product_ids──────┐
│ 1 │ [102,103] │
│ 2 │ [201,202] │
│ 3 │ [301] │
└─────────┴──────────────────┘
控制数组顺序
默认情况下,groupArray
不保证数组中的元素顺序。如果需要按某个特定顺序排列,可以使用 orderBy
子句。例如,按购买日期升序排列:
SELECT user_id, groupArray(product_id) AS product_ids
FROM purchases
GROUP BY user_id
ORDER BY purchase_date;
但是,ORDER BY
子句在这里是对整个查询结果进行排序,而不是对每个用户的数组进行排序。为了对每个用户的数组进行排序,可以使用 arraySort
函数:
SELECT user_id, arraySort(groupArray(product_id)) AS product_ids
FROM purchases
GROUP BY user_id;
输出:
┌─user_id─┬─product_ids──────┐
│ 1 │ [101,102,103] │
│ 2 │ [201,202] │
│ 3 │ [301] │
└─────────┴──────────────────┘
总结
groupArray(expr)
:将一组值聚合到一个数组中。groupArray(N)(expr)
:限制数组的最大长度。arraySort(array)
:对数组进行排序。
希望这些示例和解释能帮助你更好地理解和使用 ClickHouse 中的 groupArray
函数。如果有任何其他问题,请随时提问!