【Databend】行列转化:数据透视和逆透视

文章目录

    • 数据准备
    • 数据透视
    • 数据逆透视
    • 总结

数据准备

学生学科得分等级测试数据如下:

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】行列转化:一行变多行和简单分列 文章一行变多行,得到如下效果数据:

select t1.student_id, t1.subject_level, split_part(unnest(split(t1.subject_level, ',')), ' ', 1) as subject, split_part(unnest(split(t1.subject_level, ',')), ' ', 2) as level1
from fact_suject_data as t1
order by t1.student_id;

在这里插入图片描述

数据透视

Databend 中的 pivot 功能可以轻松实现数据透视,使用语法如下:

select ...
from ...pivot ( <aggregate_function> ( <pivot_column> )for <value_column> in ( <pivot_value_1> [ , <pivot_value_2> ... ] ) )
[ ... ]

参数解释如下:

  • <aggregate_function>:用于组合来自 <pivot_column> 的分组值的聚合函数。
  • <pivot_column>:将使用指定的 <aggregate_function> 聚合的列。
  • <value_column>:其唯一值将成为数据透视结果集中的新列。
  • <pivot_value_N>:来自<value_column>的唯一值,将成为透视结果集中的新列。
with a as(select t1.student_id, t1.subject_level, split_part(unnest(split(t1.subject_level, ',')), ' ', 1) as subject, split_part(unnest(split(t1.subject_level, ',')), ' ', 2) as level1from fact_suject_data as t1order by t1.student_id)
select *
from a pivot (max(level1) for subject in ('china','math','english'));

在这里插入图片描述

数据逆透视

Databend 中 unpivot 功能通过将列转换为行,起到数据逆透视效果。它是一个关系运算符,接受两列(来自表或子查询)以及列列表,并为列表中指定的每列生成一行。使用语法如下:

select ...
from ...unpivot ( <value_column>for <name_column> in ( <column_list> ) )
[ ... ]

参数解释:

  • <value_column>:将存储从<column_list>中列出的列中提取的值的列。
  • <name_column>:将存储提取值的列名称的列。
  • <column_list>:要旋转的列列表,用逗号分隔。

利用数据透视的结果,使用 unpivot 恢复原样实现数据逆透视。

with a as(select t1.student_id, t1.subject_level, split_part(unnest(split(t1.subject_level, ',')), ' ', 1) as subject, split_part(unnest(split(t1.subject_level, ',')), ' ', 2) as level1from fact_suject_data as t1order by t1.student_id),b as(select *from a pivot (max(level1) for subject in ('china','math','english')) )
select *
from b unpivot (level2 for subject in (`china`,`math`,`english`));

在这里插入图片描述

总结

Databend 的 pivot 和 unpivot 功能更好地实现数据的透视和逆透视,并且非常易读和分析大量数据,相较于 Mysql 实现数据透视 (case …when…) 和逆透视 (union all) 来说更简单易读,方法不闲多主要是解决实际问题,学习了解更多方法和工具,在面对问题时也能更好的应对,赶紧实操起来,当遇到也能很自信地说“这题我会”。

参考资料:

  • Mysql 行列变换《你想要的都有》:https://blog.csdn.net/weixin_50357986/article/details/134161183
  • Databend Query Pivot:https://docs.databend.com/sql/sql-commands/query-syntax/query-pivot
  • Databend Query UnPivot:https://docs.databend.com/sql/sql-commands/query-syntax/query-unpivot
  • Databend 行列转化:一行变多行和简单分列:https://blog.csdn.net/weixin_50357986/article/details/135568736

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

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

相关文章

Unity中URP下实现深度贴花(雾效支持和BRP适配)

文章目录 前言一、让我们的贴画支持雾效1、我们舍弃内部的MixFog方法2、使用 雾效混合因子 对最后输出颜色进行线性插值相乘 二、在Shader中&#xff0c;限制贴花纹理的采样方式1、申明 纹理 和 限制采样方式的采样器2、在片元着色器进行纹理采样 三、BRP适配1、C#脚本中&#…

Github Copilot AI保密级教程

Copilot 是一款由 OpenAI 推出的人工智能代码自动补全AI工具&#xff0c;它可以帮助程序员更快、更准确地编写代码。Copilot 的核心技术基于 GPT-3 模型&#xff0c;但是在编码方面是优于GPT-3的&#xff0c;它可以根据程序员输入的上下文和代码提示&#xff0c;自动生成符合语…

2024年美赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

AD20 解决PCB铺铜与锡盘之间锯齿状连接问题的设置方法

上一篇文章&#xff1a;PCB简单绘制一般步骤 对上一篇文章中&#xff0c;关于铺铜设置的补充&#xff0c;解决铺铜与锡盘之间的锯齿状连接情况。 1、新建Demo&#xff0c;创建PCB板子&#xff0c;布置锡盘和铺铜&#xff0c;如图&#xff1a; 2、设置规则&#xff0c;参考上一…

Java医院智能3D导诊系统源码 微信小程序源码

医院智慧3D导诊系统&#xff0c; 通过输入疾病症状和选择部位进行导诊挂号&#xff0c;支持小程序端、APP端 开发背景 人们经常去医院因为不知道挂什么科而烦恼&#xff0c;有些病人不方便问又不好意思问。在互联网医院中挂号且又不知该挂什么科&#xff0c;找什么类型的医生&…

聊天机器人之接收实时信息实现(二)

准备工作 如果没有准备好环境的请看 前期环境准备 这里默认已经注入成功并且已经登录好了账号。 具体实现 实现原理 通过本地搭建一个web服务&#xff0c;来接收一个POST请求&#xff0c;这个请求中就会涵盖实时的数据&#xff0c;包括昵称、消息内容、消息类型之类的。 p…

C#销售管理系统源码

C#销售管理系统源码 框架版本: .net framework 4.8 UI控件库:CsKin 功能介绍: 1.登陆 2. 进销存管理&#xff1a;收银台、商品入库、商品浏览、退货 3. 数据统计分析: 销售统计、工资核算 4. 基础数据维护:商品分类管理、员工管理

腾讯云免费服务器怎么申请?腾讯云免费服务器申请难吗?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

2024年,谷歌云首席技术官眼中的生成AI三大支柱,来看看有啥新花样

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

EVA-CLIP: Improved Training Techniques for CLIP at Scale论文解读

文章目录 前言一、摘要二、引言三、贡献四、模型方法五、论文链接总结 前言 最近&#xff0c;我一直在搞多模态大模型相关工作&#xff0c;也深知CLIP结构重要性&#xff0c;而EVA-CLIP论文是在CLIP模型基础上进行了一系列trick&#xff0c;实现优越CLIP模型的方法&#xff0c…

【MIT 6.S081】2020, 实验记录(3),Lab: page tables

目录 TaskTask 1: Print a page table Task Task 1: Print a page table 该实验需要增加一个 vmprint 函数&#xff0c;用于打印一个 page table&#xff0c;实现过程可以参考 vm.c 文件中的 freewalk() 函数。 在 defs.h 中增加 vmprint 的定义&#xff1a; void …

5.3 Verilog 带参数例化

5.3 Verilog 带参数例化 分类 Verilog 教程 关键词&#xff1a; defparam&#xff0c;参数&#xff0c;例化&#xff0c;ram 当一个模块被另一个模块引用例化时&#xff0c;高层模块可以对低层模块的参数值进行改写。这样就允许在编译时将不同的参数传递给多个相同名字的模块…