首页 > 数据库 >经典sql题(十三)炸裂对应学生的姓名和成绩

经典sql题(十三)炸裂对应学生的姓名和成绩

时间:2024-09-25 18:20:21浏览次数:3  
标签:index 姓名 炸裂 posexplode explode score split student sql

explodeposexplode 的区别

  1. explode:

    • 用于将数组中的每个元素展开为单独的行。
    • 结果中只包含元素的值,不包含其索引。
    • 如果输入数组有 n 个元素,结果将返回 n 行。
  2. posexplode:

    • 用于将数组中的每个元素展开为单独的行,同时提供每个元素的索引。
    • 结果包含两个列:一个是元素的索引,另一个是元素的值。
    • 如果输入数组有 n 个元素,结果将返回 n 行,但每行额外包含一个索引列。

示例对比

假设有一个数组 ['A', 'B', 'C']

使用 explode
SELECT explode(array['A', 'B', 'C']) AS element;

结果:

element
A
B
C

输出行数为 3(与数组元素数量相同)。

使用 posexplode
SELECT posexplode(array['A', 'B', 'C']) AS (index, element);

结果:

indexelement
0A
1B
2C

输出行数仍为 3,但除了元素值外,还附加了索引列。

总结

  • 行数: 两者在行数上是相同的(即每个数组元素生成一行)。
  • 输出内容: explode 只返回元素,而 posexplode 返回元素及其对应的索引。

1.explode 炸裂

如果需要同时拆分两个不对应的列(例如 studentscore),可以使用 explodesplit 结合 LATERAL VIEW,但这种方法不会保持行之间的对应关系,结果将会是笛卡尔积,即每个学生的名字都会与每个分数组合在一起。

示例数据

假设表格如下:

classstudentscore
1AAlice,Bob,Charlie90,85,80

使用 explode 同时拆分两个列

你可以使用以下 SQL 查询来拆分这两个列:

SELECT class, student_name, student_score
FROM test
LATERAL VIEW explode(split(student, ',')) AS student_name
LATERAL VIEW explode(split(score, ',')) AS student_score;

结果

由于直接使用 explode,结果将会是笛卡尔积,可能如下:

classstudent_namestudent_score
1AAlice90
1AAlice85
1AAlice80
1ABob90
1ABob85
1ABob80
1ACharlie90
1ACharlie85
1ACharlie80

缺点

  • 这种方法会导致所有学生与所有分数组合在一起,生成了一个完全的笛卡尔积。
  • 每个学生的名字都会与每个分数配对,而没有保持对应关系。

2.posexplode 炸裂

如果想要通过炸裂函数将两个列(如学生和分数)拆分并对应起来,可以使用 posexplode 对两个列进行操作,确保它们的索引相匹配。以下是如何实现这一点的详细说明。

使用 posexplode 对应两个列

你可以使用以下 SQL 查询将 studentscore 两列分别拆分,并确保它们的索引相对应。

SELECT class,
       student_name,
       student_score
FROM test
LATERAL VIEW posexplode(split(student, ',')) sn AS student_index, student_name
LATERAL VIEW posexplode(split(score, ',')) sc AS score_index, student_score
WHERE student_index = score_index;

解析

  1. split(student, ','):

    • student 列的字符串按 , 拆分为数组,例如 ['Alice', 'Bob', 'Charlie']
  2. posexplode(split(student, ',')):

    • 将拆分后的数组展开成多行,并为每个元素生成一个索引。例如:
      • student_index | student_name
      • 0 | Alice
      • 1 | Bob
      • 2 | Charlie
  3. split(score, ','):

    • 类似地将 score 列拆分为数组,例如 ['90', '85', '80']
  4. posexplode(split(score, ',')):

    • 将拆分后的分数数组也展开成多行,并生成索引。例如:
  • score_index | student_score
    • 0 | 90
    • 1 | 85
    • 2 | 80
  1. WHERE student_index = score_index:
    • 通过匹配两个索引,只保留对应的学生和分数。

结果

根据上述查询,输出将会是:

classstudent_namestudent_score
1AAlice90
1ABob85
1ACharlie80

通过这种方式,posexplode 可以有效地将两个列拆分并对应起来,确保每个学生的名字和分数在结果中正确匹配。

标签:index,姓名,炸裂,posexplode,explode,score,split,student,sql
From: https://blog.csdn.net/m0_58076578/article/details/142527333

相关文章

  • mysql数据库 - anolisos安装
    文章目录一、anolisos系统介绍1.1、anolisos系统的起源1.2、anolisos系统的版本支持1.3、anolisos系统的特点1.4、anolisos系统的适用场景二、环境部署2.1、修改主机名2.2、修改静态ip地址2.3、关闭selinux2.4、关闭或放通防火墙端口三、安装mysql数据库3.1、更新yum源......
  • 【转】SQL SERVER死锁查询,死锁分析,解锁,查询占用
    简单点的处理方法:1、查询死锁的表selectrequest_session_idspid,OBJECT_NAME(resource_associated_entity_id)tableNamefromsys.dm_tran_lockswhereresource_type='OBJECT'2、解锁declare@spidintSet@spid=79--锁表进程declare@sqlvarchar(1000)set@sql......
  • SQL如何识别非工作日(法定节假日+正常周末(非调休日))?
    1.场景描述在工作中遇到一个指标“扣款成功率(工作日)”,由于涉及扣款,有些结算平台在非工作日可能不会进行资金结算,这可能导致账户余额不足,进而导致扣款失败。因此,计算指标时需要排除这一因素,以准确计算“扣款成功率(工作日)”。这个指标计算过程,我们肯定需要识别出法定节假日、调......
  • Linux常用命令(Mysql)
    --删除表内数据(Mysql)usedc;#切换到待删除表所在的数据库truncatetable[表名]#删除表--数据库导入SQL文件数据(Mysql)sourcea.sql;--SQL增删改查insertintostudent(id,name,sex,birth)values('01','赵雷','男','1990');deletefromstudentwhereid=......
  • Windows Server 安装MySQL教程(图文)
    本篇教程,在服务器WindowsServer2016(中文版)上安装MySQL8.0,并记录详细的安装步骤。1、下载安装包在mysql官网上下载安装包下载地址:https://dev.mysql.com/downloads/installer/2、安装步骤下载之后,双击运行mysql-installer-community-8.0.39.0.msi如果双击无反应,那么需要安装一......
  • MySQL SQL基础常见面试题整理
    NOSQL和SQL的区别是什么?SQL数据库是指关系型数据库,主要有:SQLServer,Oracle,MySQL(开源),PostgreSQL(开源)。关系型数据库用于存储结构化数据,这些数据在逻辑上以行和列的二维表形式存在,每一列代表一个数据属性,每一行则代表一个数据实体。NoSQL是指非关系型数据库,主要有MongoDB和......
  • Linux中MySQL配置主主复制操作
    一、GTIDGTID(GlobalTransactionIdentifier)是MySQL的一种用于标识分布式环境中事务的全局唯一标识符。它在MySQL的主从复制场景中尤为重要,尤其是在使用MariaDB或MySQL5.6及更高版本的环境中。GTID由两部分组成:服务器ID(标识执行该事务的服务器)和事务序号(表示在该服务器上执......
  • 解读MySQL8.0数据字典重构源码
    摘要:本文对社区MySQL5.7到8.0演进过程中数据字典DD的重构(缓存,持久化),AtomicDDL的关键实现进行了分析。本文分享自华为云社区《【华为云MySQL技术专栏】MySQL8数据字典重构源码解读》,作者:GaussDB数据库1.背景介绍在MySQL5.7版本的使用实践过程中,我们很容易遇到DDL崩溃后导致数......
  • Windows 11 彻底卸载MySQL和安装
    Windows11彻底卸载MySQL和安装卸载1.关闭MySQL服务快捷键Win+R打开运行窗口输入services.msc打开服务窗口找到MySQL服务,停止此服务2.卸载MySql软件进入控制面板-程序和功能卸载一切和MySQL相关的软件3.删除MySQL相关文件夹如果安装时有指......
  • mysql flaot 不准
    (JDBC-MySql)概述JDBC全称JavaDataBaseConnectivity:java数据库连接在JDBC创建之前java程序员每操作一款关系型数据库就需要学习java连接该数据库代码,由于关系型数据库过多(如:oracle、db2、MySQL......),不可能全部学习,所以java程序员就期望SUN公司能研发出一套可以运行所有关系......