将值聚合到新列中,同时保留旧列

问题描述 投票:0回答:1

问题

假设您有一些有关某些购买的简单数据:

用户ID 订单_日期 产品_id
001 2e1
001 44小时
001 周二 e6f
002 结婚 6克3
002 结婚 43米
003 结婚 k19
003 周五 9d5

我需要将产品 ID 聚合到一个数组列中,例如使用

COLLECT_SET
,按 user_idorder_date 分组。不过,我也希望保留 product_id 列,如下所示:

用户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"]

问题

我可以使用以下查询轻松创建数组列:

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
["2e1"]
001 44小时
["44h"]

当然,如果我从 GROUP BY 中排除

product_id
,则会收到错误:“表达式不在 GROUP BY 键 'product_id 中”

是否可以通过一个简单的查询来完成此操作,而无需例如创建一个临时表,然后在 user_idorder_date 上加入它们?谢谢!

sql hive
1个回答
0
投票

您没有得到正确结果的原因是您只是在行上使用 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”]
© www.soinside.com 2019 - 2024. All rights reserved.