如何分析交易记录?
【题目】
某商场为了分析用户购买渠道。表1是用户交易记录表,记录了用户id、交易日期、交易类型和交易金额。
表2是用户类型表,记录了用户支付类型(微信、支付宝、信用卡等),分别有type1、type2。
要求:
1.请在 type1的用户类型中,找出总交易金额最大的用户。
2.筛选每个用户的第2笔交易记录。
3.如下表:如何实现表3的数据格式?
4.两表做关联时,其中一张表的关联键有大量的null值会造成什么影响?如何规避?
【解题思路】
1.type1的用户类型中,找出单用户的总交易金额最大的一位用户?
我们先来把这个业务需求翻译成大白话:
1)表中的字段要有用户类型、交易金额、用户id
2)“单用户的总交易金额”是指每种类型用户的总交易金额
3)找出用户类型=type1,总交易金额最大的用户
1)表中的字段要有用户类型、交易金额、用户id
交易金额、用户id在用户交易记录表中,用户类型在用户类型表中,涉及到两个表的字段,所以需要进行多表联结。
观察两个表,得知两表的相同字段为用户id ,所以通过用户id联结两张表。
使用哪种联结呢?拿出《猴子 从零学会SQL》里面的多表联结图。
因为后面要分析“每种类型用户的总交易金额”,所以保留左表(用户交易记录表)中的全部用户数据。
1 select 用户交易记录表.* ,用户类型表.用户类型
2 from 用户交易记录表
3 left join 用户类型表
4 on 用户交易记录表.用户id=用户类型表.用户id;
查询结果:
2)每种类型用户的总交易金额
当有“每个”出现的时候,要想到《猴子 从零学会SQL》中讲过的用分组汇总来实现该业务问题。
根据各用户类型、用户id分组 (group by),统计每个用户数总费用(求和函数sum)
1 select 用户交易记录表.*,用户类型表.用户类型,
2 sum(用户交易记录表.交易金额) as 总金额
3 from 用户交易记录表
4 left join 用户类型表
5 on 用户交易记录表.用户id=用户类型表.用户id
6 group by 用户类型表.用户类型,用户交易记录表.用户id;
查询结果:
3)找出用户类型=type1,总交易金额最大的用户
用where 筛选用户类型=type1的用户,按照总金额降序排序(order by decs),找出的第一行(limit 1)记录即为交易金额最大的用户。
1 select 用户类型表.用户类型, 用户交易记录表.用户id,
2 sum(用户交易记录表.交易金额) as 总金额
3 from 用户交易记录表
4 left join 用户类型表
5 on 用户交易记录表.用户id = 用户类型表.用户id
6 where 用户类型表.用户类型 = 'type1'
7 group by 用户类型表.用户类型, 用户交易记录表.用户id
8 order by 总金额 desc limit 1;
查询结果:
2.筛选每个用户的第2笔交易记录?
1)题目要求查询“每个用户”,当每个出现的时候,就要想到分组汇总(group by或者窗口函数的partiotion by)。
2)第2笔交易记录,是指按照交易时间对每个用户的交易记录进行排名,然后取出排名第2的数据。
又涉及到分组,又涉及到排名的问题,要想到用《猴子 从零学会SQL》里讲过的窗口函数来实现。
所以使用分组(窗口函数partiotion by 用户id),并按最后交易时间升序排列(order by交易时间 asc),套入窗口函数的语法,得出下面的sql语句:
1 select 用户交易记录表.*,
2 row_number() over(partition by 用户交易记录表.用户id
3 order by 用户交易记录表.交易日期 asc) as 交易笔数
4 from 用户交易记录表;
查询结果:
2)用where 筛选出每个用户的第2条记录,就是每个用户的第2笔交易记录
1 select * from
2 (select 用户交易记录表.*,
3 row_number() over(
4 partition by 用户交易记录表.用户id
5 order by 用户交易记录表.交易日期 asc ) as 交易笔数
6 from 用户交易记录表) as a
7 where 交易笔数=2;
查询结果:
3.如下表:如何实现表3的数据格式?
题目要求将同一用户、不用的交易时间和交易类型多行合并为一行,用group_concat函数可解决。
sql入下:
1 select 用户id,
2 group_concat(交易日期), group_concat(交易类型)
3 from 用户交易记录表
4 group by 用户id;
4.两表做关联时,其中一张表的关联键有大量的null值会造成什么影响?如何规避?
因为在关联表中的全部数据不一定在另一张表都匹配,这样没有匹配到的话就会出现null,避免出现表连接出现null值,只要在表关联时加一个where条件进行判断(not null ),具体见下图
【本题考点】
1.如何将复杂的业务问题,使用多维度拆解分析方法,翻译成大白话的能力。
2.遇到排名问题,要想到使用窗口函数来实现。
3.多表联结各个情况如何去实现?把上图看懂就可以解决99%的多表联结问题了。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kotlin学习日志(三)控制语句
- Kotlin学习日志(一)TextView、Button、Toast的使用
- Kotlin学习日志(二)数据类型
- Toast提示工具类
- RadioGroup+ViewPager +Fragment 制作APP主界面底部导航和左右滑动
- MD5加密工具类
- Kotlin修炼指南(四)
- Android Studio 安装APK在虚拟机时报 Installation failed due to: 'null' 解决
- 在Android Studio中使用Kotlin
- Day21.Python项目案例
- Day18.python文件/目录
- Kotlin学习日志(六)控件使用
- Android 天气APP(一)开发准备
- Android 天气APP(二)获取定位信息
- Android 天气APP(三)访问天气API与数据请求