当前位置: 首页 > news >正文

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

题目来源:京东

目录

  • 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, --idname 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。

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

结果如下:

在这里插入图片描述

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

selectnew_id as id,concat_ws('|',collect_list(name)) as name
from(selectid,name,max(id) over (partition by name) as new_idfrom 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,叠加本步骤累积求和是一个常见解决连续问题的方式。

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

结果如下:

在这里插入图片描述

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

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

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

相关文章:

  • [Python]pyenv 环境配置
  • Selenium 库的爬虫实现
  • Host头攻击-使用加密和身份验证机制
  • git分支常用命令
  • Scrum 的速度如何衡量和提高
  • 单细胞 10X 和seurat对象学习
  • 视频推拉流EasyDSS系统如何在清理缓存文件的同时不影响缓存读写?
  • C++ 程序的基本要素
  • 通过JavaScript本地存储数据
  • HG/T 6088-2022 透水道路用涂料检测
  • 有限元法之有限元空间的构造
  • LeetCode2.两数相加
  • nodejs安装配置
  • K-means聚类算法详细介绍
  • Vue.js - 计算属性与侦听器 【0基础向 Vue 基础学习】
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Angular 2 DI - IoC DI - 1
  • docker python 配置
  • Idea+maven+scala构建包并在spark on yarn 运行
  • javascript 哈希表
  • JS专题之继承
  • React组件设计模式(一)
  • vagrant 添加本地 box 安装 laravel homestead
  • Web标准制定过程
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 关于List、List?、ListObject的区别
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 经典排序算法及其 Java 实现
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端面试之闭包
  • 自制字幕遮挡器
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • $().each和$.each的区别
  • (7)STL算法之交换赋值
  • (floyd+补集) poj 3275
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (利用IDEA+Maven)定制属于自己的jar包
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (篇九)MySQL常用内置函数
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转) ns2/nam与nam实现相关的文件
  • (转)JAVA中的堆栈
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)Scala的“=”符号简介
  • (转)socket Aio demo
  • (转)母版页和相对路径
  • ***检测工具之RKHunter AIDE
  • *Django中的Ajax 纯js的书写样式1
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .java 9 找不到符号_java找不到符号