【题目】

某商场为了分析用户购买渠道。表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%的多表联结问题了。

推荐:如何从零学会sql?

sql 同一张表中两个记录不能共存_如何分析交易记录?相关推荐

  1. access重复数据累计_Access 查询同一张表中两个或以上字段含有重复项的记录

    这篇文章是对我自己另一篇文章的补充.( Access 查询同一张表中某个字段含有重复项的记录) 记录的动力总是来自于工作中遇到的问题.上次只要根据某个字段把有重复项的记录列出来,这次条件增多了,要根据 ...

  2. sql查询当天交易总额最大的用户信息_如何分析交易记录? 因为后面要分析“每种类型用户的总交易金额”,所以保留左表(用户交易记录表)中的全部用户数据。 【题目】 某商场为了分析用... - 雪球...

    来源:雪球App,作者: 猴子数据分析,(https://xueqiu.com/1350621016/159703178) 因为后面要分析"每种类型用户的总交易金额",所以保留左表 ...

  3. python做值班表预测_Django model一张表中两个字段设置外键参考另一张表两个字段...

    class products(models.Model): MODE_CHOICES=(('week','周'),('day','日')) productname=models.CharField(m ...

  4. mysql比较两张表中两个字段值_如何通过SQL找出2个表里值不同的列的方法

    以下有两个表,他们的结构完全相同,请通过SQL找出值不同的列. Student_1 NAME AGE SCORE peter 26 100 jack 25 96 daniel 26 48 bark 2 ...

  5. SQL 语句从表中选取前5行,后5行的记录,以及%用法

    一.如何选取前五行.后五行记录: --前5行:select top 5 * from table --后5行:select top 5 * from table order by id desc 其中 ...

  6. MySQL 一张表中两个字段值互换

    update table a, table b set a.filed1= b.field2, a.field2= b.field1 where a.id = b.id

  7. 【SQL怎么写】查询同一张表中同一个ID对应最新时间的数据记录

    需求 同一张表中,怎么查询出同一个ID的最新记录,比如,某一个用户做过很多次修改,我只以最后一次提交记录为准,这时候是不是犯难了 1.数据准备 SET NAMES utf8mb4; SET FOREI ...

  8. 使用sql如何找出两张表中同一字段的不同值

    前言: 正逢五一假期有时间来继续更新几篇有关于sql语句的相关博客.在做后台算法测试的时候可能常常会遇到查看输入表中的某条数据是否成功写入到输出表中了,这时候就需要对比这两张表中的数据了. 想要实现这 ...

  9. 用一条sql语句删除表中所相同记录

    用一条sql语句删除表中所相同记录如下一.具有主键的情况 a.具有唯一性的字段id(为唯一主键) delete table where id not in ( select max(id) from ...

最新文章

  1. 使用css的类名交集复合选择器
  2. asp.net 无法获取客户端请求的真实协议https
  3. SAP WebService基础知识
  4. SAP Cloud for Customer(C4C)前台显示的数据是如何从后台读取的
  5. PAT_B_1026_Java(15分)
  6. winform 判断控件有没有被遮挡_编程入门基础之 winform(2)
  7. pom.xml中依赖的<optional>true</optional>标签
  8. iPhone 12 Pro真机照首曝光:无刘海再添实锤?
  9. 基于JAVA+Swing+MYSQL的工资管理系统
  10. Python 爬取 20 万条评论,告诉你周杰伦新歌为啥弄崩 QQ 音乐?
  11. 【数学基础】特征值,特征向量与SVD奇异值分解
  12. python运维脚本面试_参加Linux运维面试时经常会被问到的shell脚本问题有哪些?
  13. 易语言编写影视大全的整体思路及ACF浏览器和cheni纯组件列表灵活运用
  14. 【stata】一些关于数据处理的基础知识(备查代码)
  15. 【计算几何】【极角排序】Gym - 101174B - Bribing Eve
  16. 【百页AI报告】2017人工智能现状、创业图景与未来(98PPT)
  17. 腾讯回应“暴力裁员”
  18. 权限控制-@Secured注解
  19. struct 中 typedef的用法
  20. 三十而立的用友,未来的路将向何方?

热门文章

  1. java字符串构造函数的应用_构造函数中的参数0需要找不到类型为'java.lang.String'的bean...
  2. java 同步 异步 阻塞 非阻塞_Java日志正确使用姿势,大白话搞懂什么是同步/异步/阻塞/非阻塞...
  3. php背景时间渐变,CSS3怎么实现背景颜色渐变?(图文+视频)
  4. java 抽象 属性_在java中如何定义一个抽象属性示例详解
  5. python类介绍_Python基础介绍 | Class类
  6. 中班音乐活动 机器人_幼儿园中班音乐活动教案《机器人》
  7. matlab画坐标系,Matlab绘制图形坐标轴操作汇总 | 望天博客
  8. Linux父进程如何发信号给子进程,在父进程和子进程之间发送信号
  9. linux-headers,如何升级linux-headers-generic?
  10. rman report list crosscheck delete -rman常用命令。