题目要求:
某金融公司某项目下有如下 2 张表。现需要查询 Tom 这个客户在 2023 年每月的消费金额(按月份正序显示)
请编写 SQL 语句实现上述需求。
表结构:
交易表 trade(t_id:交易流水号,t_time:交易时间,t_cus:交易客户,t_type:交易类型【1表示消费,0表示转账】,t_amount:交易金额)
客户表 customer(c_id:客户号,c_name:客户名称)
运行结果示例:
思路:
本题需要我们找到客户表中姓名为Tom的客户在 2023 年每月的消费金额。因此我们需要首先从客户表中找到Tom所对应的客户id,再到交易表中寻找该用户id所对应的交易金额总数,需要注意的是我们需要使用group by子句对交易金额按照月份进行分组统计,并按照该字段排序。此外,我们还应注意题目中的限定条件,即限定时间为2023年,限定交易类型为1“消费”。
从日期或日期时间字段中提取特定的部分数据可以通过时间日期函数实现,例如year();month();day();hour();minute();second();可以用于分别获取年份、月份、日子、时、分、秒数据。dayofweek();用于获取星期几。date();time();分别用于获取日期和时间。date_format();用于格式化输出。
运行代码示例:
题目要求:
某产品2022年2月8日系统推荐内容给部分用户的数据,以及用户信息和对推荐内容的评分交叉表部分数据如下:
请统计推荐内容准确的用户平均评分?(结果保留3位小数) 准确定义:推荐的内容标签与用户喜好标签一致;如推荐多次给同一用户,有一次及以上准确就归为准确。
表结构:
运行结果示例:
思路:
我们首先通过关联两张表,找到推荐内容准确的用户及其评分,再使用avg()计算均值即可。需要注意的是,由于存在多次推荐准确的情况,为避免重复计算,我们需要进行去重操作。
运行代码示例:
题目要求:
某酒店客房信息数据及某晚入住信息数据如下。
请查询该酒店从6月12日开始连续入住多晚的客户信息?
要求输出:客户id、房间号、房间类型、连续入住天数(按照入住天数升序排序)
表结构:
客房信息表guestroom_tb(room_id-房间号,room_type-房间类型,room_price-房间价格),如下所示
入住信息表checkin_tb(info_id-信息id.room_id-房间号,user_id-客户id,checkin_time-入住时间,checkout_time-退房时间),该表存储该晚客户入住信息及后续退房信息,如下所示
运行结果示例:
以客户203为例,在2022-06-12入住酒店,在2022-06-14退房,连续在12日晚、13日晚入住在该酒店,故结果如上。
思路:
本题目中我们需要使用datediff()函数计算时间差,也就是计算入住时间和退房时间之间的间隔,并需要限定查询条件为时间间隔大于1且入住时间在2022年6月12日及之后。同时,连接客房信息表,通过房间号字段获取到对应的房间类型。查询结束后需要按照指定字段进行排序。
运行代码示例:
题目要求:
某公司员工信息数据及单日出勤信息数据如下。请统计该公司各岗位员工平均工作时长?
注:如员工未打卡该字段数据会存储为NULL,那么不计入在内;
要求输出:员工岗位类别、平均工作时长(以小时为单位输出并保留三位小数),按照平均工作时长降序排序
表结构:
员工信息表staff_tb(staff_id-员工id,staff_name-员工姓名,staff_gender-员工性别,post-员工岗位类别,department-员工所在部门),如下所示
出勤信息表attendent_tb(info_id-信息id,staff_id-员工id,first_clockin-上班打卡时间,last_clockin-下班打卡时间),如下所示
运行结果示例:
思路:
本题中,我们需要使用timestampdiff()函数来计算员工工作时间,因为上一题中的datediff()函数只能计算日期之间的差值,但是本题我们需要以秒为单位计算(需要先按秒计算,再转换为时,否则计算结果不准)。我们查询出工作时间的同时,还可以连接员工信息表,根据员工id找到员工所属的部门,将该表作为临时表。
之后,我们直接在临时表中使用avg()函数分组计算每个部分工作时间的均值即可。需要主要使用round()函数保留3位小数,并按照工作时间降序排序。
运行代码示例:
题目要求:
请根据以上数据分析各还款能力级别的客户逾期情况,按照还款能力级别统计有逾期行为客户占比?
要求输出还款能力级别、逾期客户占比;
注:逾期客户占比要求按照百分数形式输出并四舍五入保留 1 位小数,最终结果按照占比降序排序.
表结构:
有贷款信息表:loan_tb(agreement_id:合同id,customer_id:客户id,loan_amount:贷款金额,pay_amount:已还金额,overdue_days:逾期天数)
客户信息表:customer_tb(customer_id:客户id,customer_age:客户年龄,pay_ability:还款能力级别)
运行结果示例:
结果解释:
还款能力级别为 C 的客户有1113、1116、1119,其中有逾期行为的客户为 1113、1119,故结果为 2/3=66.7%
思路:
本题我们可以先对数据进行一下处理,连接两张表,统计出我们需要的字段,也就是还款能力、逾期时间,其中,由于我们只需要知道客户是否已经逾期即可,不需要知道具体的逾期天数,因此我们可以通过判断逾期天数是否为空,用1和0表示逾期与否。
之后,在临时表中,我们按照还款能力字段进行分组,统计逾期人数和总人数,其中对于逾期人数的计算,由于我们上一步已经对逾期天数进行了处理,因此我们直接使用sum()加和就可以。
需要注意的是结果要求输出百分数,因此我们要将计算结果乘以100,并在得出的结果之后使用字符串拼接函数concat()拼接一个“%”。
运行代码示例:
题目要求:
你正在搭建一个用户活跃度的画像,其中一个与活跃度相关的特征是“最长连续登录天数”, 请用SQL实现“2023年1月1日-2023年1月31日用户最长的连续登录天数”
表结构:
思路:
最长连续登录我们之前已经做过很多遍了,是一种非常固定的题型。使用窗口函数即可。
运行代码示例: