当前位置:网站首页>快速实现分列转到行(SQL版)一个问题,三种解法!
快速实现分列转到行(SQL版)一个问题,三种解法!
2022-08-08 21:14:00 【朱小五是凹凸君呀】
大家好,我是热心读者。
首先,这是一篇水文,但是作为一个系列的三胞胎之一,我觉得有必要通过一题多解来扩散一下思维,正所谓“条条大路通罗马”。
前两篇文章分别为:
数据源以及效果大致是这样的:

通过观察数据,我们发现其实达到的效果,就是列转行,读懂了题意,那么解法就很容易出来了。
下文语法为hivesql,其实在mysql或者sqlserver中也可以实现,不过是需要换一换函数即可,关系性数据库的作业 就留给读者来实现了。
好的,我们就先来构造一下数据:首先建表,两个字段:
create table if not exists student_info(
class string COMMENT '年级',
students string COMMENT '姓名'
);
其次,往表中插入数据:
INSERT INTO TABLE yht_dw.student_info
SELECT *
FROM (
SELECT '1年级' AS class
,'A1;B1;C1' AS name
UNION ALL
SELECT '2年级' AS class
,'A2;B2;C2' AS name
UNION ALL
SELECT '3年级' AS class
,'A3;B3;C3' AS name
UNION ALL
SELECT '4年级' AS class
,'A4;B4;C4' AS name
UNION ALL
SELECT '5年级' AS class
,'A5;B5;C5' AS name
UNION ALL
SELECT '6年级' AS class
,'A6;B6;C6' AS name
UNION ALL
SELECT '7年级' AS class
,'A7;B7;C7' AS name
UNION ALL
SELECT '8年级' AS class
,'A8;B8;C8' AS name
UNION ALL
SELECT '9年级' AS class
,'A9;B9;C9' AS name
) t
;
表中数据情况:

下面就直接公布答案:
SELECT t.class
,item AS name
FROM yht_dw.student_info t
LATERAL VIEW explode(split(t.students,';')) names AS item
;
上结果图:

来解释一下这里的语法
split(string,seprator)
split函数传入两个参数,对string按照seprator进行拆分,这里就相当于把一个字符串变成了一个array
explode
顾名思义,就是“爆炸”函数,就是把上面拆分的array给炸开,由一行三列,变为三行一列
lateral view
跟 explode是一个固定搭配,相当于一种笛卡尔积,将爆炸函数得到的行跟class关联起来
正常来讲,文章到此就结束了,但是太水我觉得内心不安;
而有的读者也会有疑问,我列转行了,那我如何“回去”呢?——也就是如何进行转列呢?
下面接着上脚本:
SELECT class
,collect_set(name) AS names
FROM (
SELECT t.class
,item AS name
FROM yht_dw.student_info t
LATERAL VIEW explode(split(t.students,';')) names AS item
) tt
GROUP BY class
;
上结果图:

我懒,没有重新构造数据,直接用的子查询,但是看到结果,可能有读者会有疑问,这个咋还有方括号,还有双引号,这个也太不美观了。
别急,我先解释完语法,解释完,再来优化。
其实hive里有一个类似于“汇总数据”sum的函数,collect_set是专注于文本的汇总杀器,而重要的是:它会剔除重复记录。
那如何解决方括号和双引号的问题呢?
其实也很简单,上脚本:
SELECT class
,concat_ws(';',collect_set(name)) AS names
FROM (
SELECT t.class
,item AS name
FROM yht_dw.student_info t
LATERAL VIEW explode(split(t.students,';')) names AS item
) tt
GROUP BY class
;
上优化后结果图:

其实就是加了一个concat_ws函数,此时就把方括号跟双引号给去除了。
好了,今天的文章就是这样,希望没有接触hive语法的同学有所得,已经熟悉hive的同学莫要嘲笑知识点的简单。
以上。
一天介绍一本书(凹凸数据)
别怕,Excel VBA其实很简单(第3版):本书用浅显易懂的语言和生动形象的比喻,并配以大量插画,讲解Excel VBA中看似复杂的概念和代码。从简单的宏录制与运行、VBA编程环境和基础语法的介绍,到常用Excel对象的操作与控制、事件的灵活使用、设计自定义的操作界面、调试与优化编写的代码,都进行了形象的介绍。
点击这里,阅读更多数据文章!
边栏推荐
猜你喜欢
随机推荐
keras调用load_model时报错ValueError: Unknown layer:*解决办法
目标检测论文 Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector
用js写一个简单的前世今生
H5 移动端调取手机相机或相册
Under the Windows socket (TCP) console program
leetcode 217存在重复元素
关闭MySQL自动提交
Property or method “XXX“ is not defined on the instance but referenced during render.
数据库week01
关于广播实现强制下线
第九章 常用类解析
MySQL
最简单的idea构建微服务模块
[The browser opens the exported excel]
【Voice of dreams】
全国基础地理数据库数据预处理
swagger中忽略方法里的对象参数
微信小程序下拉刷新上拉加载更多
position的值,relative和absolute分别相对谁定位
matlab入门基础{特殊变量}:单元型变量和结构型变量