最近有个小伙伴去面试数据相关岗位,说遇到一个SQL题,没做出来,其他答得都挺好,最后没消息了,估计错失了offfer!我让他回忆一下,描述了一下问题,发现竟然是我之前写的书《SQL数据分析:从基础破冰到面试题解》里的题目,我看了下书,是在第117页的题目8,属于简单题。
原题目如下,大家测试下自己能做出来么:
现有一张社区团购用户订单表【group_buy】,该表记录了用户在不同日期通过不同渠道登录团购页面和产生订单的情况,表中包含4个字段:
用户ID(user_id):VARCHAR
登录渠道(login_source):VARCHAR
登录日期(login_date):DATE
产生订单数量(order_count):INT
group_buy表的数据如表14-8所示。
表14-8 group_buy表
user_id | login_source | login_date | order_count |
a001 | applet | 2021-03-20 | 1 |
a002 | application | 2021-03-20 | 0 |
a003 | web | 2021-03-21 | 0 |
a002 | application | 2021-03-21 | 2 |
a001 | applet | 2021-03-21 | 4 |
a003 | application | 2021-03-22 | 1 |
a001 | applet | 2021-03-22 | 1 |
a004 | application | 2021-03-23 | 1 |
数据导入:本题目使用的数据从本书配套的group_buy.sql导入sql_book数据库,代码如下:
DROP TABLE IF EXISTS group_buy;
CREATE TABLE group_buy(
user_id VARCHAR(8),
login_source VARCHAR(15),
login_date DATE,
order_count INT(8)
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8;
INSERT INTO
group_buy (user_id,login_source,login_date,order_count)
VALUE ('a001','applet','2021-03-20',1)
,('a002','application','2021-03-20',0)
,('a003','web','2021-03-21',0)
,('a002','application','2021-03-21',2)
,('a001','applet','2021-03-21',4)
,('a003','application','2021-03-22',1)
,('a001','applet','2021-03-22',1)
,('a004','application','2021-03-23',1);
问题一:查询每个用户首次登录的渠道名称。
输出内容包括:
用户ID(user_id)
登录渠道(login_source)
结果样例如图14-9所示。
图14-9 结果样例
可供参考的解题思路:使用MIN()函数找出每个用户最早的登录时间,将原始表和每个用户最早登录时间进行INNER JOIN以获取用户ID和用户登录渠道。
涉及知识点:分组聚合、多表连接
本题的SQL代码如下,供读者参考:
SELECT a.user_id
,a.login_source
FROM group_buy a
INNER JOIN
(
SELECT user_id
,MIN(login_date) AS first_login_date
FROM group_buy
GROUP BY user_id
) b
ON a.user_id = b.user_id AND a.login_date = b.first_login_date;
涉及知识点:分组聚合、多表连接
本题的SQL代码如下,供读者参考:
SELECT user_id
,login_date
,SUM(order_count) OVER (PARTITION BY user_id ORDER BY login_date) total_order_count
FROM group_buy;
问题二:查询用户登录日期和当日用户下单数量。
输出内容包括:
用户ID(user_id)
登录日期(login_date)
当日用户下单数量(total_order_count)
结果样例如图14-10所示。
图14-10 结果样例
可供参考的解题思路:使用SUM()窗口函数,根据用户ID进行分组并根据登录日期排序,即可得到用户登录日期的下单数量。
涉及知识点:窗口函数
本题的SQL代码如下,供读者参考:
SELECT user_id
,login_date
,SUM(order_count) OVER (PARTITION BY user_id ORDER BY login_date) total_order_count
FROM group_buy;
本文题目内容摘自已出版的《SQL数据分析:从基础破冰到面试题解》,该书包含大量练习题(共48个),并附带数据导入和参考解析代码,更多题目见下图:
以下是一些常见疑问和解答:
没有基础可以学吗?
可以,本书从环境搭建开始,从基础入门到进阶,然后通过题目实战提升SQL能力,是一本关于SQL 数据分析的实战手册。
本书对比市面上大部分SQL书籍的特色是什么?
将数据分析挖掘中所需的SQL能力抽出来专门写,不会涉及很多不常用的功能语法,由浅入深,并配套大量练习题(可作为求职笔试面试的练习题),每个练习题都配有数据导入、解题思路和参考答案。练习题会结合当前数据分析很多场景需求来编制,例如“活跃用户分析”、“连续登录用户分析”、“社区团购行为分析”、“商品销量同环比”。
本书适合数据分析相关岗位求职备考准备么?
很适合,本书展现了数据分析工作的日常内容,给出了数据分析岗位的工作技能要求,然后讲述了数据分析笔试与面试中对SQL 的考查知识点。通过3种难度的题目练习,能提升求职能力并达到初级数据分析挖掘岗位对SQL的能力要求。
本书的适合什么样的读者?
数据分析与数据开发求职者和从业者
计算机科学与技术、统计学、数学、大数据、人工智能、数据科学相关专业的师生
对数据分析和SQL感兴趣人群
转行做数据分析与数据开发的人员
大家有需要或者有兴趣可以扫码下方图片购买(优惠价:加邮费只需50元,5折):
跟着本书刷完题,相信你能从容应对笔面试的SQL题目~