SQL行转列,将json数组拆分成多行,一行变多行例子,(LATERAL VIEW explode)

需求背景

有一张工程师能力表,如:

张三 擅长java、c、c++、c#、js

李四 擅长java、go

王五 擅长css、f#

陈六 擅长as、c、java

。。。

需要统计擅长各种语言的工程师的数量,如:

java 3

c 2

go 1

代码示例

使用LATERAL VIEW explode 组合,模拟上述统计案例

sql 复制代码
-- 创建表A
drop table A;
CREATE TABLE A (
  id INT,
  channels STRING,
  partition_time STRING
)
PARTITION BY LIST( partition_time )
(
    PARTITION p_20221130 VALUES IN ( '20221130' ),
    PARTITION default
)
STORED AS ORCFILE COMPRESS;

-- 示例数据插入表A
INSERT INTO A PARTITION (partition_time='20221130') VALUES
  (1, '[101, 102, 103]', '20221130'),
  (2, '[102]', '20221130'),
  (3, '[103]', '20221130'),
  (4, '[101, 102]', '20221130'),
  (5, '[101, 103]', '20221130');

-- 使用LATERAL VIEW explode(channels)统计channels出现的次数
SELECT channel, COUNT(*) AS count
FROM A
LATERAL VIEW explode(split(regexp_replace(channels, '\\[|\\]|\\s', ''), ',')) t AS channel
WHERE partition_time = '20221130'
GROUP BY channel;

输出结果

channel count

101 3

102 3

103 3

相关推荐
RainbowSea15 小时前
7. MySQL 当中的 InnoDB 数据存储结构(详解)
java·sql·mysql
烧瓶里的西瓜皮15 小时前
Go语言从零构建SQL数据库(6) - sql解析器(番外)- *号的处理
数据库·sql·golang
阿里云云原生18 小时前
SQL开发的智能助手:通义灵码在IntelliJ IDEA中的应用
sql
在努力的韩小豪1 天前
MySQL的左连接、右连接、内连接、外连接
数据库·sql·mysql·多表查询·联表查询·左右连接·内外连接
ylfhpy1 天前
Java面试黄金宝典35
java·数据库·sql·算法·面试·职场和发展
Tyler先森1 天前
Oracle数据库数据编程SQL<5 正则表达式函数*****>
数据库·sql·oracle
haaaaaaarry1 天前
【SQL】子查询详解(附例题)
java·数据库·sql
Always_away2 天前
数据库系统概论|第三章:关系数据库标准语言SQL—课程笔记1
数据库·笔记·sql·学习
oh,huoyuyan2 天前
火语言RPA--SqlServer-执行SQL
sql·sqlserver·rpa
caihuayuan42 天前
Java 面试系列:Java 中的运算符和流程控制 + 面试题
java·大数据·sql·spring·课程设计