简单行转列

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
简介: 本文介绍了基于配送订单表的数据处理方法,包括使用 `collect_list`、`collect_set` 和 `sort_array` 函数实现行转列操作。通过 SQL 查询,实现了骑手 ID 和配送品类的统计,并对数据进行了去重和排序处理。此外,还提供了相关函数的详细说明和示例,以及数据准备的 SQL 语句。最后推荐了更多关于行转列和列转行的相关文章。

一、基础数据

有配送订单表记录骑手配送的物品类型、送达时间、顾客id、配送举例及配送费。

+-----------+-----------+-------------+----------------------+--------------+-----------+----------+
| rider_id  | order_id  | goods_type  |    delivery_time     | customer_id  | distance  | payment  |
+-----------+-----------+-------------+----------------------+--------------+-----------+----------+
| r001      | 0001      | 食品          | 2024-01-01 08:30:00  | c001         | 8.05      | 7.50     |
| r002      | 0002      | 酒水          | 2024-01-01 08:43:00  | c003         | 3.01      | 13.00    |
| r003      | 0003      | 食品          | 2024-01-01 09:15:00  | c004         | 4.12      | 3.50     |
| r002      | 0004      | 文件          | 2024-01-01 09:21:00  | c005         | 10.98     | 15.00    |
| r001      | 0005      | 食品          | 2024-01-01 09:30:00  | c007         | 2.32      | 5.00     |
| r002      | 0006      | 食品          | 2024-01-01 09:47:00  | c002         | 0.78      | 5.00     |
| r003      | 0007      | 文件          | 2024-01-01 10:21:00  | c010         | 8.11      | 8.00     |
| r001      | 0008      | 酒水          | 2024-01-01 11:56:00  | c023         | 4.35      | 15.00    |
| r002      | 0009      | 电子产品        | 2024-01-01 12:30:00  | c031         | 5.05      | 9.50     |
| r002      | 0010      | 文件          | 2024-01-01 13:30:00  | c001         | 6.05      | 7.00     |
+-----------+-----------+-------------+----------------------+--------------+-----------+----------+

二、函数介绍

1.collect_list函数介绍

collect_list(expr) - 收集并返回一个非唯一元素的列表

Examples:

> SELECT collect_list(col) FROM VALUES (1), (2), (1) AS tab(col);
 [1,2,1]

注意

该函数是非确定性的,因为收集结果的顺序取决于行的顺序,这在经过shuffle之后可能是不确定的。

Since: 2.0.0

2.collect_set函数介绍

collect_set(expr) - 收集并返回一个唯一元素的集合。

Examples:

> SELECT collect_set(col) FROM VALUES (1), (2), (1) AS tab(col);
 [1,2]

注意

该函数是非确定性的,因为收集结果的顺序取决于行的顺序,这在经过shuffle之后可能是不确定的。

Since: 2.0.0

3.sort_array介绍

sort_array(array[, ascendingOrder]) - 根据数组元素的自然顺序,将输入数组排序为升序或降序。对于double/float类型,NaN值大于任何非NaN元素。在升序排序中,空元素将被放置在返回数组的开头;在降序排序中,空元素将被放置在返回数组的末尾。

Examples:

> SELECT sort_array(array('b', 'd', null, 'c', 'a'), true);
 [null,"a","b","c","d"]

Since: 1.5.0

4.concat_ws函数介绍

concat_ws(sep[, str | array(str)]+) - 使用 sep 作为分隔符返回字符串的连接,跳过空值。

Examples:

> SELECT concat_ws(' ', 'Spark', 'SQL');
  Spark SQL
> SELECT concat_ws('s');

> SELECT concat_ws('/', 'foo', null, 'bar');
  foo/bar
> SELECT concat_ws(null, 'Spark', 'SQL');
  NULL

Since: 1.5.0

三、行转列

1.直接行转列

根据配送订单记录表,查询出骑手id,配送品类数据 goods_type_list

执行SQL

select rider_id,
       concat_ws(',', collect_list(goods_type)) as goods_type_list
from t_delivery_orders
group by rider_id

执行结果

+-----------+-------------------+
| rider_id  |  goods_type_list  |
+-----------+-------------------+
| r001      | 食品,食品,酒水          |
| r002      | 酒水,文件,食品,电子产品,文件  |
| r003      | 食品,文件             |
+-----------+-------------------+

2.行转列去重

根据配送订单记录表,查询出骑手id,配送品类数据 goods_type_list,要求goods_type_list中不重复。

执行SQL

select rider_id,
       concat_ws(',', collect_set(goods_type)) as goods_type_list
from t_delivery_orders
group by rider_id

执行结果

+-----------+------------------+
| rider_id  | goods_type_list  |
+-----------+------------------+
| r001      | 酒水,食品            |
| r002      | 酒水,食品,文件,电子产品    |
| r003      | 食品,文件            |
+-----------+------------------+

3.行转列后排序

根据配送订单记录表,查询出骑手id,配送品类数据 goods_type_list,要求goods_type_list中不重复且数据按照倒叙排列

执行SQL

select rider_id,
       concat_ws(',',sort_array(collect_set(goods_type),false)) as goods_type_list
from db_topic_rowcolumn.t_delivery_orders
group by rider_id

执行结果

+-----------+------------------+
| rider_id  | goods_type_list  |
+-----------+------------------+
| r001      | 食品,酒水            |
| r002      | 食品,酒水,电子产品,文件    |
| r003      | 食品,文件            |
+-----------+------------------+

四、数据准备

--建表语句
CREATE TABLE IF NOT EXISTS t_delivery_orders
(
    rider_id      string,         -- 骑手ID
    order_id      string,         -- 订单ID
    goods_type    STRING,         -- 物品类型
    delivery_time STRING,         -- 送达时间
    customer_id   STRING,         -- 客户id
    distance      decimal(10, 2), -- 配送距离,单位可以是公里或英里
    payment       decimal(10, 2)  -- 支付金额,骑手的配送费用
)
    COMMENT '骑手配送订单表';
--插入数据
INSERT INTO t_delivery_orders VALUES
('r001', '0001', '食品', '2024-01-01 08:30:00','c001',8.05,7.50),
('r002', '0002', '酒水', '2024-01-01 08:43:00','c003',3.01,13.00),
('r003', '0003', '食品', '2024-01-01 09:15:00','c004',4.12,3.50),
('r002', '0004', '文件', '2024-01-01 09:21:00','c005',10.98,15.00),
('r001', '0005', '食品', '2024-01-01 09:30:00','c007',2.32,5.00),
('r002', '0006', '食品', '2024-01-01 09:47:00','c002',0.78,5.00),
('r003', '0007', '文件', '2024-01-01 10:21:00','c010',8.11,8.00),
('r001', '0008', '酒水', '2024-01-01 11:56:00','c023',4.35,15.00),
('r002', '0009', '电子产品', '2024-01-01 12:30:00','c031',5.05,9.50),
('r002', '0010', '文件', '2024-01-01 13:30:00','c001',6.05,7.00);

相关推荐

  1. 行转列-collect_list,collect_set进行简单行转列
  2. 行转列-使用transform进行有序行转列
  3. 行转列-使用transform进行有序行转列-多列一一对应
  4. 行转列-多行转多列(竖表转横表)
  5. 列转行-多列转多行(横表变竖表)
  6. 列转行-lateral view explode列转行
  7. 列转行-explode_outer和lateral view outer
  8. 列转行-posexplode多列对应转行
  9. 列转行-lateral view outer posexplode及posexplode_outer多列对应转行
相关文章
|
SQL 分布式计算 MaxCompute
odps sql 怎么实现递归查询?
odps sql 怎么实现递归查询?
1199 1
|
SQL 分布式计算 MaxCompute
MaxCompute SQL使用小技巧之多列转多行
上一篇分析了常用的行列转换,在这里补充一点使用posexplode函数进行多列转多行
1053 0
|
Java 关系型数据库 MySQL
记录解决一个小错误:Establishing SSL connection without server‘s identity verification is not recommended
本文记录了解决Spring Boot连接MySQL时出现的SSL连接警告问题的步骤,通过在数据源配置中添加`useSSL=false`来禁用SSL连接。
|
SQL JSON 分布式计算
ODPS SQL ——列转行、行转列这回让我玩明白了!
本文详细介绍了在MaxCompute中如何使用TRANS_ARRAY和LATERAL VIEW EXPLODE函数来实现列转行的功能。
|
10月前
|
SQL 数据库
UPDATE
【11月更文挑战第04天】
342 1
|
存储 Cloud Native 关系型数据库
云原生数据仓库使用问题之如何将一行数据转换为多行数据
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
机器学习/深度学习 数据可视化 测试技术
统计学入门:时间序列分析基础知识详解
本文探讨了时间序列分析的核心概念,包括自协方差、自相关和平稳性。通过Python实现和图形化展示了这些概念,以增进理解。时间序列涉及观察随时间变化的数据,如心率或温度。自协方差和自相关衡量数据点之间的关系,滞后表示时间间隔。弱平稳性意味着均值、方差和协方差不随时间变化。文章介绍了自回归(AR)、移动平均(MA)、ARMA和ARIMA模型,用于描述不同类型的序列行为。统计检验如ADF和Durbin-Watson用于检测平稳性和残差自相关。ARIMA模型特别适用于非平稳数据,通过差分实现平稳化。文章还提供了代码示例和可视化来辅助学习。
315 4
|
XML 开发框架 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(2)
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(2)
|
分布式计算 DataWorks 大数据
MaxCompute操作报错合集之在使用 MaxCompute 的 MMA(Multi-Modal Analytics)进行跨 Region 数据迁移时,在配置数据源时遇到错误,如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
使用SDAutoLayout实现控件根据内容进行宽度自适应和高度自适应
使用SDAutoLayout实现控件根据内容进行宽度自适应和高度自适应
209 2