多行数据合成一行

SELECT DISTINCT customer_order_no, customer_item_no, customer_name_full OVER (PARTITION BY customer_order_no, customer_item_no) AS customer_name
FROM (SELECT customer_order_no, customer_item_no, SYS_CONNECT_BY_PATH (customer_name, ',') customer_name_full FROM (
SELECT customer_order_no, customer_item_no, customer_name, LAG(customer_name, 1, '') OVER (PARTITION BY customer_order_no, customer_item_no ORDER BY customer_name) customer_name_1
FROM (
SELECT t.customer_order_no, t.customer_item_no,t.customer_name FROM tourism_hotel_order_customer t where t.customer_order_no = '20081230R007' and t.customer_item_no = '01'
)) CONNECT BY PRIOR customer_name = customer_name_1 ORDER BY customer_order_no, customer_item_no)
在 Hive 中将多行数据合并一行,主要依赖于聚合函数和一些特定的函数组合。以下是几种常见的实现方法: ### 使用 `collect_list` 和 `concat_ws` 进行多行合并 这是最常用的方法之一,适用于将多行数据合并为字符串形式。通过 `collect_list` 函数收集所有值,再通过 `concat_ws` 函数将这些值合并为一个以特定分隔符连接的字符串。 #### 示例: 假设有一个表 `table1`,其结构如下: | col1 | col2 | col3 | |------|------|------| | A | B | 1 | | A | B | 2 | | A | C | 3 | | A | C | 4 | 可以通过以下 SQL 语句将 `col3` 的值合并一行: ```sql SELECT col1, col2, concat_ws(',', collect_list(cast(col3 AS string))) AS col3 FROM table1 GROUP BY col1, col2; ``` 该查询的结果如下: | col1 | col2 | col3 | |------|------|------| | A | B | 1,2 | | A | C | 3,4 | 此方法利用了 `collect_list` 收集分组后的所有值,并通过 `concat_ws` 指定逗号作为分隔符将这些值合并为一个字符串[^3]。 --- ### 使用 `collect_set` 和 `concat_ws` 进行去重合并 如果需要合并的值中可能存在重复,并希望去除重复项,可以使用 `collect_set` 替代 `collect_list`,它会自动去重。 #### 示例: 假设有一个表 `product_promotion`,其中包含产品和促销 ID 的关系: | product_id | promotion_id | |------------|--------------| | 5112 | 960024 | | 5112 | 960025 | | 5112 | 960024 | | 5113 | 960043 | | 5113 | 960044 | 可以使用以下 SQL 语句将 `promotion_id` 去重并合并: ```sql SELECT product_id, concat_ws('_', collect_set(promotion_id)) AS promotion_ids FROM product_promotion GROUP BY product_id; ``` 查询结果如下: | product_id | promotion_ids | |------------|---------------------------------| | 5112 | 960024_960025 | | 5113 | 960043_960044 | 此方法利用了 `collect_set` 的去重特性,确保合并的值没有重复,再通过 `concat_ws` 指定下划线作为分隔符进行合并[^4]。 --- ### 复杂场景下的多行合并 在某些复杂场景中,可能需要处理多字段的合并,或者分段提取数据。可以通过嵌套查询和 `row_number()` 等函数实现。 #### 示例: 假设有一个表 `test_tbl`,其中包含字段 `id`, `name`, 和 `age`,需要将其合并一行,并以 `&` 分隔。 ```sql SELECT concat_ws('&', collect_set(concat(line))) AS line FROM ( SELECT concat_ws(',', id, name, age) AS line FROM ( SELECT id, name, age, row_number() OVER (PARTITION BY rk ORDER BY id) AS rn FROM ( SELECT '1' AS rk, id, name, NVL(age, '') AS age FROM test_tbl ) t1 ) t2 WHERE t2.rn > 5000 ) t3; ``` 此查询通过 `row_number()` 实现分段提取,避免数据量过大导致显示不全的问题,再通过 `collect_set` 和 `concat_ws` 实现最终的多行合并[^5]。 --- ### 总结 Hive 提供了多种方法来实现多行数据合并一行,具体方法取决于数据的特性和需求。如果不需要去重,可以使用 `collect_list` 和 `concat_ws`;如果需要去重,则可以使用 `collect_set`;在处理复杂场景时,可以通过嵌套查询和 `row_number()` 等函数实现更精细的控制。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值