假设您有一些有关某些购买的简单数据:
用户ID | 订单_日期 | 产品_id |
---|---|---|
001 | 我 | 2e1 |
001 | 我 | 44小时 |
001 | 周二 | e6f |
002 | 结婚 | 6克3 |
002 | 结婚 | 43米 |
003 | 结婚 | k19 |
003 | 周五 | 9d5 |
我需要将产品 ID 聚合到一个数组列中,例如使用
COLLECT_SET
,按 user_id 和 order_date 分组。不过,我也希望保留 product_id 列,如下所示:
用户ID | 订单_日期 | 产品_id | 产品 ID |
---|---|---|---|
001 | 我 | 2e1 |
|
001 | 我 | 44小时 |
|
001 | 周二 | e6f |
|
002 | 结婚 | 6克3 |
|
002 | 结婚 | 43米 |
|
003 | 结婚 | k19 |
|
003 | 周五 | 9d5 |
|
我可以使用以下查询轻松创建数组列:
SELECT user_id,
order_date,
COLLECT_SET(product_id) AS product_ids
FROM table t
GROUP BY user_id, order_date
但是这样我就无法获得我需要的每一行的 product_id 列。
同时,如果我这样包含 product_id:
SELECT user_id,
order_date,
product_id,
COLLECT_SET(product_id) AS product_ids
FROM table t
GROUP BY user_id, order_date, product_id
那么product_ids列将始终是长度为1的数组,即:
用户ID | 订单_日期 | 产品_id | 产品 ID |
---|---|---|---|
001 | 我 | 2e1 |
|
001 | 我 | 44小时 |
|
当然,如果我从 GROUP BY
中排除
product_id,则会收到错误:“表达式不在 GROUP BY 键 'product_id 中”
是否可以通过一个简单的查询来完成此操作,而无需例如创建一个临时表,然后在 user_id 和 order_date 上加入它们?谢谢!
您没有得到正确结果的原因是您只是在行上使用 COLLECT_SET 函数,对所有其他列进行分组(这将返回同一个表)。
您可以聚合 user_id 和 order_date 上的表,并创建聚合数据集。然后将主表与基于这两列的聚合数据集连接起来,您就会得到预期的结果。
SELECT
t1.user_id,
t1.order_date,
t1.product_id,
t2.product_ids
FROM
table t1
LEFT JOIN (
SELECT
user_id,
order_date,
COLLECT_SET(product_id) AS product_ids
FROM
table t
GROUP BY
user_id, order_date
) AS t2
这是执行相同操作的查询。首先是主表,与聚合表连接,选择表将
COLLECT_SET
结果表为此处的 product_ids
列。
子查询将返回以下数据集
用户ID | 订单_日期 | 产品 ID |
---|---|---|
001 | 我 | ["2e1","44h"] |
001 | 周二 | [“e6f”] |
002 | 结婚 | ["6g3","43m"] |
003 | 结婚 | [“k19”] |
003 | 周五 | [“9d5”] |
那么整体查询的结果将是
用户ID | 订单_日期 | 产品_id | 产品 ID |
---|---|---|---|
001 | 我 | 2e1 | ["2e1","44h"] |
001 | 我 | 44小时 | ["2e1","44h"] |
001 | 周二 | e6f | [“e6f”] |
002 | 结婚 | 6克3 | [“6g3”,“43m”] |
002 | 结婚 | 43米 | [“6g3”,“43m”] |
003 | 结婚 | k19 | [“k19”] |
003 | 周五 | 9d5 | [“9d5”] |