【Databend】行列转化:一行变多行和简单分列

文章目录

    • 数据准备和需求
    • 生成序列和分隔函数
    • 根据分隔符变多行
    • JSON 数据简单分列
    • 总结

数据准备和需求

行列转化在实际工作中很常见,其中最常见的有一行变多行,有下面一份数据:

drop table if exists fact_suject_data;
create table if not exists fact_suject_data
(student_id    int          null comment '编号',subject_level varchar null comment '科目等级',subject_level_json variant null comment '科目等级json数据'
);
insert into fact_suject_data(student_id, subject_level,subject_level_json) values (12,'china e,english d,math e','{"china": "e","english": "d","math": "e"}');
insert into fact_suject_data(student_id, subject_level,subject_level_json) values (2,'china b,english b','{"china": "b","english": "b"}');
insert into fact_suject_data(student_id, subject_level,subject_level_json) values (3,'english a,math c','{"english": "a","math": "c"}');
insert into fact_suject_data(student_id, subject_level,subject_level_json) values (4,'china c,math a','{"china": "c","math": "a"}');
insert into fact_suject_data(student_id, subject_level,subject_level_json) values (5,'china d,english a,math c','{"china": "d","english": "a","math": "c"}');
insert into fact_suject_data(student_id, subject_level,subject_level_json) values (6,'china c,english a,math d','{"china": "c","english": "a","math": "d"}');
insert into fact_suject_data(student_id, subject_level,subject_level_json) values (7,'china a,english e,math b','{"china": "a","english": "e","math": "b"}');
insert into fact_suject_data(student_id, subject_level,subject_level_json) values (8,'china d,english e,math e','{"china": "d","english": "e","math": "e"}');
insert into fact_suject_data(student_id, subject_level,subject_level_json) values (9,'china c,english e,math c','{"china": "c","english": "e","math": "c"}');

在这里插入图片描述
需求是将学生学科等级和等级分隔成多行,效果如下:
在这里插入图片描述

生成序列和分隔函数

Databend 生成序列有专门的函数 generate_series(, [, <step_interval>]),生成从指定点开始,在另一个指定点结束的数据集,并且可以选择增量值。适用的数据类型有 整数、日期和时间戳。

select generate_series as n  from generate(1, 10);
select generate_series as n  from generate(1, 10, 2);
+---+
| n |
+---+
| 1 |
+---+
| 3 |
+---+
| 5 |
+---+
| 7 |
+---+
| 9 |
+---+
select generate_series as n from generate_series('2024-01-01'::date, '2024-01-07'::date);
+---------------+
| calendar_date |
+---------------+
|   2024-01-01  |
+---------------+
|   2024-01-02  |
+---------------+
|   2024-01-03  |
+---------------+
|   2024-01-04  |
+---------------+
|   2024-01-05  |
+---------------+
|   2024-01-06  |
+---------------+
|   2024-01-07  |
+---------------+
  • split(<input_string>,):使用指定的分隔符拆分字符串,并将结果部分作为数组返回。
  • split_part(<input_string>,, ):使用指定的分隔符拆分字符串并返回指定的部分。
  • unnest(array):将数组拆分成多行。
select subject_level, split(subject_level, ',')         as split_char, split_part(subject_level, ',', 1) as part1
from (select 'china e,english d,math e' as subject_level) as a
+--------------------------+----------------------------------+------------+
|       subject_level      |             split_char           |   part1    | 
+--------------------------+----------------------------------+------------+
| china e,english d,math e | ['china e','english d','math e'] |  china e   |
+--------------------------+----------------------------------+------------+
select subject_level, unnest(split(subject_level, ',')) as unne_char
from (select 'china e,english d,math e' as subject_level) as a;
+--------------------------+------------+
|       subject_level      | unne_char  | 
+--------------------------+------------+
| china e,english d,math e |  china e   |
+--------------------------+------------+

split_part() 函数与 Mysql 中的 substring_index() 类似。

根据分隔符变多行

根据上面函数讲解,
方法一:我们可以使用 split(<input_string>,) 和 unnest(array) 函数实现。

select t1.student_id,t1.subject_level
,unnest(split(t1.subject_level,',')) as subject_level1
from fact_suject_data as t1
order by t1.student_id;

方法二:也可以使用 split_part(<input_string>,, ) 单独实现。

select t1.student_id, t1.subject_level, t2.n, split_part(t1.subject_level, ',', t2.n) as subject_level1
from fact_suject_data as t1left join (select generate_series as n from generate_series(1, 30)) t2on t2.n <= (length(t1.subject_level) - length(replace(t1.subject_level, ',', '')) + 1)
order by t1.student_id;

通过 generate_series() 生成的序列数值作为 split_part() 的分隔参数即可实现,与 Mysql 行列变换《你想要的都有》中分隔原理一致。

JSON 数据简单分列

对于 subject_level_json 列数据,我们可以使用 json 独有的函数实现分列透视的效果。

select subject_level_json, replace(json_path_query(subject_level_json, '$.china'), '"', '') as china, get(subject_level_json, 'math')                                  as math, get(subject_level_json, 'english')                               as english
from fact_suject_data as t1
order by t1.student_id;

在这里插入图片描述

总结

数据分列和一行变多行的应用非常常见,通过本文的学习,相信基本上能处理类似问题,遇到面试相关问题也能完美解决,赶紧动手实操看看效果吧!!!

参考资料:

  • Databend Array Functions:https://docs.databend.com/sql/sql-functions/array-functions/
  • Mysql 行列变换《你想要的都有》:https://blog.csdn.net/weixin_50357986/article/details/134161183
  • Databend 基础函数应用:https://blog.csdn.net/weixin_50357986/article/details/135535471

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/345755.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之迭代器模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

linux搭建SRS服务器

linux搭建SRS服务器 文章目录 linux搭建SRS服务器SRS说明实验说明搭建步骤推流步骤查看web端服务器拉流步骤final SRS说明 SRS&#xff08;simple Rtmp Server&#xff09;,是一个简单高效的实时视频服务器&#xff0c;支持RTMP/WebRTC/HLS/HTTP-FLV/SRT, 是国人自己开发的一款…

“所有伙食开销统计:轻松查看,智能管理你的餐饮支出“

你是否经常为伙食开销感到困扰&#xff0c;不知道如何有效控制和管理&#xff1f;现在&#xff0c;有了我们的伙食开销统计工具&#xff0c;这些问题将得到轻松解决&#xff01; 首先第一步&#xff0c;我们要进入晨曦记账本并在上方功能栏里选择“查看方式”。并在弹出来的列表…

c++算法之枚举

目录 解空间的类型 循环枚举解空间 例题 特别数的和 输入格式 输出格式 输入样例&#xff1a; 输出样例&#xff1a; 解 例题 反倍数 问题描述 输入格式 输出格式 样例输入 样例输出 解 例题 找到最多的数 解 枚举算法是一种基本的算法思想&#xff0c;它通过…

写一个文字滑动切换样式效果

<template><div class"mainrouter centerWindi"><h1>2024,马上暴富</h1></div> </template> <style lang"scss"> /* 居中 */ .centerWindi {apply flex justify-center items-center;text-align: center; }/* 路…

【Linux笔记】进程等待与程序替换

一、进程的终止 1、进程退出码 在讲解进程的终止之前&#xff0c;先要普及一下进程的退出码概念。 我们父进程之所以要创建子进程&#xff0c;就是为了让子进程运行不一样的任务&#xff0c;那么对于子进程执行的这个任务执行完毕后的结果是否正确或者是否出差错&#xff0c…

宝塔面板安装MySQL8数据库

第一步&#xff1a;搜索mysql 第二步: 点击安装 我这里选择安装8版本 第三步&#xff1a;给宝塔配置mysql防火墙 第四步&#xff1a;修改数据库密码 第五步&#xff1a;想要使用navicat连接 需要修改root的权限 &#xff08;1&#xff09;使用secureCRT先登录mysql (2) 输入u…

网络——华为与华三

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 写在前面 大家好&#xff0c;我是网络豆&#xff0…

公司运营数据分析大屏:引领企业决策,驱动业务增长

在数字化时代&#xff0c;数据已经成为企业决策的关键。为了更好地洞察市场趋势、优化业务流程、提升运营效率&#xff0c;越来越多的企业开始引入数据分析大屏以分析公司运营状况。这一创新举措不仅改变了传统的管理模式&#xff0c;更引领企业迈向智能化决策的新篇章。 公司运…

Linux常用命令之tar解压缩文件、uname -a查看系统信息

tar&#xff1a;解压缩 *.Z-------------------compress程序压缩的文件*.gz------------------gzip程序压缩的文件*.bz2-----------------bzip2程序压缩的文件*.tar------------------tar程序打包的数据,并没有压缩*.tar.gz---------------tar程序打包的文件,其中经过gzip的压…

PHP代码审计基础知识

前言 本文章主要是PHP代码审计的一些基础知识&#xff0c;包括函数的用法&#xff0c;漏洞点&#xff0c;偏向基础部分&#xff0c;个人能力有限&#xff0c;部分可能会出现错误或者遗漏&#xff0c;读者可自行补充。 代码执行 代码执行是代码审计当中较为严重的漏洞&…

Java多线程并发篇----第十一篇

系列文章目录 文章目录 系列文章目录前言一、什么是悲观锁二、什么是自旋锁三、Synchronized 同步锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、什么是悲观…