HQL面试题练习 —— 合并数据

news2024/9/24 7:15:47

题目来源:京东

目录

  • 1 题目
  • 2 建表语句
  • 3 题解

1 题目


已知有数据 A 如下,请分别根据 A 生成 B 和 C。

数据A

+-----+-------+
| id  | name  |
+-----+-------+
| 1   | aa    |
| 2   | aa    |
| 3   | aa    |
| 4   | d     |
| 5   | c     |
| 6   | aa    |
| 7   | aa    |
| 8   | e     |
| 9   | f     |
| 10  | g     |
+-----+-------+

数据B

+-----+-----------------+
| id  |      name       |
+-----+-----------------+
| 7   | aa|aa|aa|aa|aa  |
| 4   | d               |
| 5   | c               |
| 8   | e               |
| 9   | f               |
| 10  | g               |
+-----+-----------------+

数据C

+-----+-----------+
| id  |   name    |
+-----+-----------+
| 3   | aa|aa|aa  |
| 4   | d         |
| 5   | c         |
| 7   | aa|aa     |
| 8   | e         |
| 9   | f         |
| 10  | g         |
+-----+-----------+
  1. 希望对 name 相同的数据进行合并处理,name 相同的合并到一起用 '|'进行拼接,id 取组内最大值;
  2. 希望对相邻 name 相同的数据进行合并,name 相同的合并到一起用 '|' 进行拼接,id 取组内最大值;

2 建表语句


CREATE TABLE IF NOT EXISTS t_jd_idname_concat (
    id bigint, --id
    name STRING -- name
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS ORC;

insert into t_jd_idname_concat(id, name) values
(1,'aa'),
(2,'aa'),
(3,'aa'),
(4,'d'),
(5,'c'),
(6,'aa'),
(7,'aa'),
(8,'e'),
(9,'f'),
(10,'g');

3 题解

1. 生成B

第一步:使用聚合函数开窗,给每行数据添加最大ID,作为新的分组ID。

select
    id,
    name,
    max(id) over (partition by name) as new_id
from t_jd_idname_concat;

结果如下:

在这里插入图片描述

第二步:根据 new_id 分组,拼接 name,得到结果

select
    new_id as id,
    concat_ws('|',collect_list(name)) as name
from
    (
    select
        id,
        name,
        max(id) over (partition by name) as new_id
    from t_jd_idname_concat) t
group by new_id;

结果如下:

在这里插入图片描述

2. 生成C


该小问属于是连续问题上进行数据拼接,所以我们先要对数据进行分组处理。

第一步:增加标识列,确认是否与上一行相同,如果相同则给0,不同给1。

select id,
       name,
       if(name = lag(name, 1, name) over (order by id), 0, 1) as flag
from t_jd_idname_concat;

结果如下:

在这里插入图片描述

第二步:对 flag 累积求和,得到分组标志。

注意,第一步给flag 相同为0 不同为 1,叠加本步骤累积求和是一个常见解决连续问题的方式。

select
    id,
    name,
    flag,
    sum(flag)over(order by id) as grp
from
    (
    select
        id,
        name,
        -- 这里要注意if语句中0,1的位置不能互换(核心)
        if(name = lag(name,1,name)over(order by id),0,1) as flag
    from t_jd_idname_concat
    ) t;

结果如下:

在这里插入图片描述

第三步:求分组内的最大值,完成拼接。

select
    id,
    concat_ws('|',collect_list(name)) as name
from
(select
    grp,
    name,
    max(id) over(partition by grp) as id
from
(select
    id,
    name,
    flag,
    sum(flag)over(order by id) as grp
from
    (select
        id,
        name,
        -- 这里要注意if语句中0,1的位置不能互换(核心)
        if(name = lag(name,1,name)over(order by id),0,1) as flag
    from t_jd_idname_concat
    ) t ) tt ) ttt
group by id;

结果如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件设计师】程序语言

1.程序设计语言基本概念 1.1 低级语言与高级语言 低级语言:机器语言和汇编语言称为低级语言 机器语言指0.,1组成的机器指令序列 汇编语言指用符号表示指令的语言,如MOV AX,2 高级语言:从人类的逻辑角度出发&#xff0…

WebGL在医学成像方面的应用

WebGL(Web Graphics Library)是一种用于在Web浏览器中呈现3D和2D图形的JavaScript API。它被广泛应用于各种领域,包括医学成像。以下是WebGL在医学成像方面的应用及其详细描述。北京木奇移动技术有限公司,专业的软件外包开发公司&…

蓝牙----wireshark抓包查看蓝牙通信过程

一.完整过程 二.过程详细分析 1.广播数据----可连接的无定向广播包:ADV_IND 2.广播数据----主动扫描:扫描请求(SCAN_REQ) 扫描相应(SCAN_RSP)3.被动扫描数据发送连接请求 4.蓝牙配对(没有用到…

香橙派 AIpro开发板:开启AI视觉的无限可能

前言 在当今这个由数据和智能驱动的时代, 人工智能(AI) 已经成为推动技术创新和实现自动化的关键。 特别是在计算机视觉领域,AI的潜能被无限放大,它使得机器能够“看见”并理解视觉世界,从而执行复杂的任务…

企业内部通讯软件—WorkPlus适配信创即时通讯软件

在现代企业中,良好的内部通讯是保持高效工作和顺利运营的关键。企业内部通讯软件的选择对于提升沟通效率、促进团队合作、保障数据安全和隐私保护至关重要。本文将介绍企业内部通讯软件的重要性探讨一些常用的软件,帮助企业做出明智的选择。 一、企业内…

Java面试八股之synchronized关键字的作用

synchronized关键字的作用 同步与线程安全:synchronized是Java中的一个关键字,用于提供一种同步机制,确保线程安全。它通过在多线程环境中控制对共享资源的访问,防止数据的不一致性问题。 修饰代码块:当synchronized…

cuda 11.6 pytorch安装

在安装之前,需要先配置GPU环境(安装CUDA和CudaNN) 命令行输入nvidia-smi,查看驱动信息 nvidia-smi 安装相应的CUDA 和CUDANN 验证:输入nvcc --version 或者nvcc -V 进行检查 nvcc --version nvcc -V 在anaconda里创建环境 co…

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-KDE卷积神经网络结合…

武汉网红餐馆火灾背后的安全警示:可燃气体报警器需定期校准

在餐饮业快速发展的今天,安全问题一直是行业内外关注的重点。 最近,武汉一家网红餐馆在就餐高峰期突发火灾,事件迅速成为公众关注的焦点。这一事故不仅给餐馆带来了重大损失,也引发了对于餐馆安全管理的深思。 尤其是可燃气体报…

Unity学习日志

目录 获取相机可视范围的世界坐标(2D) 视口转世界坐标和屏幕转世界坐标的区别: 屏幕转世界坐标 视口转屏幕坐标 视口转屏幕结合3D数学实现可视范围的怪物生成 transform.up游戏对象的方向问题 其实还有一种不用Translate的写法: 修改 transform.up 的行为和影响 C#抽象…

OrangePi AIPro:次世代嵌入式边缘AI计算与智能机器人应用开发平台

近年来,随着物联网(IoT)和人工智能(AI)技术的快速发展,嵌入式边缘计算板卡在智能设备中的应用越来越广泛。OrangePi AIpro作为一款轻量化高性能的嵌入式边缘人工智能计算SoC,在硬件配置、AI性能和使用便利性方面都有着突出的表现。本文将详细评测OrangePi AIpro的各个方…

【Flutter】Dialog组件PageView组件

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Flutter学习 🌠 首发时间:2024年5月27日 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 目…

重生之while在鸣潮学习HTML

个人主页:终端 今天是开荒的第五天,数据坞都刷了吗,没刷就过来学html! 目录 JavaWeb学习路线 1.HTML入门 1.1什么是HTML 1.2HTML&CSS&JavaScript的作用 1.3什么是超文本 1.4什么是标记语言 1.5HTML基础结构 1.6HTML的…

图形学初识--双线性插值算法

文章目录 为什么需要双线性插值算法?双线性插值算法是什么?如何双线性插值?结尾:喜欢的小伙伴可以点点关注赞哦 为什么需要双线性插值算法? ChatGP回答: 双线性插值(bilinear interpolation&am…

【UE5.1 角色练习】08-传送技能

前言 在上一篇(【UE5.1 角色练习】07-AOE技能)基础上继续实现人物通过鼠标点击然后传送技能的功能。 效果 步骤 1. 首先需要显示鼠标光标,我们可以在玩家控制器中勾选“显示鼠标光标” 2. 在项目设置中添加一个操作映射,设置按…

助力企业标准化搭建--图框模板的创建

古有秦皇书同文、车同轨,今各行各业都有国际标准、国家标准,其目的就是为了标准化、统一化,由此可见标准化的重要性;一个企业若是想规范员工的操作,推行标准化也很重要;因此对于需要绘制电气图纸的行业来说…

路由器交换机直连方案(RM50+RTL8367N)

不经过网口和变压器,实现板级网口扩展。 通过网口,网线连接 板级芯片直接连接,验证OK 激光导航控制板通过路由器上网成功

linux定时任务管理操作

1、Crontab命令格式 crontab [-u username] [-l|-e|-r] 参数: -u: 只有root才能进行这个任务,也即帮其他用户新建/删除crontab工作调度; -e: 编辑crontab 的工作内容; -l: 查阅crontab的工作内容; -r: 删除所有的crontab的工作内容,若仅…

LangChain 0.2 - 对话式RAG

文章目录 一、项目说明二、设置1、引入依赖2、LangSmith 三、Chains1、添加聊天记录Contextualizing the question聊天记录状态管理 2、合并 四、Agents1、检索工具2、代理建造者3、合并 五、下一步 本文翻译整理自:Conversational RAG https://python.langchain.co…