热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何分析交易记录?

【题目】某商场为了分析用户购买渠道。表1是用户交易记录表,记录了用户id、交易日期、交易类型和交易金额。表2是用户类型表,记录了用户支付类型࿰

【题目】

某商场为了分析用户购买渠道。表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》里面的多表联结图。

因为后面要分析“每种类型用户的总交易金额”,所以保留左表(用户交易记录表)中的全部用户数据。

select 用户交易记录表.* ,用户类型表.用户类型
from 用户交易记录表
left join 用户类型表
on 用户交易记录表.用户id=用户类型表.用户id;

查询结果:

2)每种类型用户的总交易金额

当有“每个”出现的时候,要想到《猴子 从零学会SQL》中讲过的用分组汇总来实现该业务问题。

根据各用户类型、用户id分组 (group by),统计每个用户数总费用(求和函数sum)

select 用户交易记录表.*,用户类型表.用户类型,sum(用户交易记录表.交易金额) as 总金额
from 用户交易记录表
left join 用户类型表
on 用户交易记录表.用户id=用户类型表.用户id
group by 用户类型表.用户类型,用户交易记录表.用户id;

查询结果:

3)找出用户类型=type1,总交易金额最大的用户

用where 筛选用户类型=type1的用户,按照总金额降序排序(order by decs),找出的第一行(limit 1)记录即为交易金额最大的用户。

select 用户类型表.用户类型,  用户交易记录表.用户id,sum(用户交易记录表.交易金额) as 总金额
from 用户交易记录表
left join 用户类型表
on 用户交易记录表.用户id = 用户类型表.用户id
where 用户类型表.用户类型 = 'type1'
group by 用户类型表.用户类型, 用户交易记录表.用户id
order by 总金额 desc limit 1;

查询结果:

2.筛选每个用户的第2笔交易记录?

1)题目要求查询“每个用户”,当每个出现的时候,就要想到分组汇总(group by或者窗口函数的partiotion  by)。

2)第2笔交易记录,是指按照交易时间对每个用户的交易记录进行排名,然后取出排名第2的数据。

又涉及到分组,又涉及到排名的问题,要想到用《猴子 从零学会SQL》里讲过的窗口函数来实现。

所以使用分组(窗口函数partiotion by 用户id),并按最后交易时间升序排列(order by交易时间 asc),套入窗口函数的语法,得出下面的sql语句:

select 用户交易记录表.*,row_number() over(partition by 用户交易记录表.用户id order by 用户交易记录表.交易日期 asc) as 交易笔数
from 用户交易记录表;


查询结果:

2)用where 筛选出每个用户的第2条记录,就是每个用户的第2笔交易记录

 

select * from
(select 用户交易记录表.*,
row_number() over(partition by 用户交易记录表.用户id order by 用户交易记录表.交易日期 asc ) as 交易笔数
from 用户交易记录表) as a
where 交易笔数=2;

查询结果:

3.如下表:如何实现表3的数据格式?

题目要求将同一用户、不用的交易时间和交易类型多行合并为一行,用group_concat函数可解决。

sql入下:

select 用户id,
group_concat(交易日期), group_concat(交易类型)
from 用户交易记录表
group by 用户id;

4.两表做关联时,其中一张表的关联键有大量的null值会造成什么影响?如何规避?

因为在关联表中的全部数据不一定在另一张表都匹配,这样没有匹配到的话就会出现null,避免出现表连接出现null值,只要在表关联时加一个where条件进行判断(not null ),具体见下图

【本题考点】

1.如何将复杂的业务问题,使用多维度拆解分析方法,翻译成大白话的能力。

2.遇到排名问题,要想到使用窗口函数来实现。

3.多表联结各个情况如何去实现?把上图看懂就可以解决99%的多表联结问题了。

推荐:如何从零学会sql?


推荐阅读
  • 数据输入验证与控件绑定方法
    本文提供了多种数据输入验证函数及控件绑定方法的实现代码,包括电话号码、数字、传真、邮政编码、电子邮件和网址的验证,以及报表绑定和自动编号等功能。 ... [详细]
  • 本文介绍了MySQL窗口函数的基本概念、应用场景及常见函数的使用方法。窗口函数在处理复杂查询时非常有用,例如计算每个用户的订单排名、环比增长率、以及动态聚合等。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • 本文介绍了如何在 Oracle 数据库中查询重复数据,并提供了多种方法来筛选和删除重复记录,包括基于单个字段和多个字段的重复数据处理。 ... [详细]
  • 解决ADODB连接Access时出现80004005错误的方法
    本文详细介绍了如何解决在使用ADODB连接Access数据库时遇到的80004005错误,包括错误原因分析和具体的解决步骤。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • 本文详细解析了MySQL中常见的几种错误,并提供了具体的解决方法,帮助开发者快速定位和解决问题。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文介绍了一种使用SQL Server存储过程来实现基于单一条件的高效分页查询的方法。通过示例代码,详细说明了如何构建和执行这种分页查询。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
author-avatar
让自己更加成熟一点
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有