SQL技巧——行转列/列转行
在做特征工程的时候,会经常会碰到一个场景,比如手上有一张用户表user,记录了用户某款产品每一天各个功能的使用次数,存储方式类似key-value键值结构。具体如下:
用户使用行为统计表user
此时需要对用户进行建模,需要一张用户纬度的特征表,记录用户在每个功能的使用次数、占比的特征,这种情况就需要行转列的操作。而相应的有反操作,列转行。
行转列
- case when <expr> then <result>…else <default> end
- if(expr, true_result, false_result)
## 方法一
select uid
, max(case when fid = 100 then num else 0 end) as fid_100
, max(case when fid = 101 then num else 0 end) as fid_101
, max(case when fid = 103 then num else 0 end) as fid_103
from user group by uid## 方法二
select uid
, max(if(fid = 100, num, 0)) as fid_100
, max(if(fid = 101, num, 0)) as fid_101
, max(if(fid = 103, num, 0)) as fid_103
from user group by uid
行转列结果表
除了以上根据条件判断来实现行转列的场景,有的场景是要把多行合并,比如有用户的评论流水表comment,此时我们想对同一个用户的所有评论拼接到一起,然后做文本分类。
用户评论流水表comment
- collect_list:把列聚合成为数组,不去重
- collect_set:把列聚合成为数据,去重
- concat_ws(separator, str1, str2, ...):把多个字符串用分隔符进行拼接
select uid
, concat_ws(" ", collect_list(content)) as content
from comment group by uid
行转列结果表
(思考题:如果要按照时间sendtime来排序,那应该怎么实现呢?至少有两种解决思路)
评论按照sendtime排序的结果表
列转行
有的时候我们拿到像用户玩过的各种游戏的数据表,但是游戏是拼接到一起的,这个时候我们只想关注某一些游戏,需要过滤掉不关注的游戏,需要怎么办呢?这时候只需要对表进行列转行操作,然后再进行筛选即可。
用户玩过的游戏表user_game
- explode:处理数组结构的字段,转换成多行;
- LATERAL VIEW:其实explode是一个UDTF函数(一行输入多行输出),这个时候如果要select除了explode得到的字段以外的多个字段,需要创建虚拟表。
select uid
, game
from user_game
LATERAL VIEW explode(split(game_list,",")) tmpTable as game
-- split(game_list,",")相对字符串切割,得到数组
-- game 是给 explode(split(game_list,",")) 列起的别名
结果表result
这个时候我们只要用select语句筛选关注的游戏即可。
(思考题:如果数据表中,用户和游戏是n对n的关系,应该怎么处理成1对1的关系呢?)
用户玩过的游戏表user_game
SQL技巧——行转列/列转行相关推荐
- 多列转多行sql oracle,sql多行转多列,中文没办法聚集的有关问题
sql多行转多列,中文没办法聚集的问题? 我要将下表 选项 答案 姓名 爱好 篮球 bruce 年龄 28 bruce 性别 ...
- SQL Server 行转列,列转行
一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name ,value = ( STUFF(( SELECT ',' + val ...
- SQL Server 行转列,列转行。多行转成一列
一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name ,value = ( STUFF(( SELECT ',' + val ...
- 做图表统计你需要掌握SQL Server 行转列和列转行
原文:做图表统计你需要掌握SQL Server 行转列和列转行 说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需 ...
- oracle 行转列的sql,Oracle行转列、列转行的Sql语句总结
目录结构如下: 行转列 列转行 [一].行转列 1.1.初始测试数据 表结构:TEST_TB_GRADE sql代码 create table TEST_TB_GRADE ( ID NUMBER(10 ...
- sqlserver中某列转成以逗号连接的字符串及逆转、数据行转列列转行
Sql Server 列转逗号隔开的字符串 和 逆转 https://www.cnblogs.com/duanyuerui/p/7567692.html Sql server 中将数据行转列列转行(一 ...
- SQL Server 行转列
SQL Server 行转列 继上次的列转行需求之后,最近又遇到一个行转列的需求.因为表设计的时候考虑到可能存在多类型的数据,但是其实最后使用只有固定的几种,所以前端界面也都是固定的.所以这个时候改表 ...
- Hive(行转列 列转行)
Hive(行转列 列转行) 行转列 行专列常用的几种方式有 collect_list collect_set 举例说明 原数据 sql SELECT concat_ws("|",c ...
- mysql 复杂行转列_有趣的SQL(四) 行转列的复杂应用和优化思想
原标题:有趣的SQL(四) 行转列的复杂应用和优化思想 导读 本文节选自松华老师<SQL优化专栏> 大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 在之前的的系列文章:有趣的SQL ...
- mysql 复杂行转列_有趣的SQL(4) 行转列的复杂应用和优化思想
大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 在之前的的系列文章中,有意思的SQL(3) 行转列,列转行和复制 已经给大家介绍了,行转列,列转行,复制等方法. 在这篇文章中,对其进行更深一层 ...
最新文章
- 设计模式的征途—17.模板方法(Template Method)模式
- 昔日的独角兽Docker资金紧张,未来前途未卜
- redis6持久化主从复制
- 小白安装eclipse插件—testNG
- PyTorch-混合精度训练
- 《销售总监》读书笔记
- Macosx 安装 ionic 成功教程
- 【职场】高薪的条件你满足几条?
- 从Mixin到hooks,谈谈对React16.7.0-alpha中即将引入的hooks的理解
- 经济统计学专业学C语言,经济统计学专业有哪些课程
- 龙果开源支付系统 架构全新升级
- Gale-Shapley算法(基于python3.6)
- 页面提交时,显示“提交中”等待效果
- timeroc 最优最佳截断值特异度(specificity)与灵敏度(sensitivity)
- GATK GATK best practices notes
- Visio绘制论文文献技术路线图流程图
- 如何看中兴70后程序员从公司跳楼
- 美国计算机学教授薪酬,揭秘:美国大学教授薪酬待遇如何?
- sublime php 代码校验,Sublime Text下配置SublimeLinter进行PHP代码检查
- vxWorks系统ps2键盘,tty设备,vga设备的联系