引言
非常常见的面试题,也是平时练手的经典题,把知识点串起来的同时也很好的联系了业务实际。直接将代码背诵记忆同样可在相似场景中发挥作用。
业务背景
该实战可以渗透到各种实际需求中,总的来说可以概括为:打标签(其实这个范围很广) & 客户分层。
准备 & 用到的知识
- 示例数据
- SQL 编辑器(笔者 dbForge)
- SQL 基础(AS, 聚合函数, 子查询, 简单的文本处理函数)
对 SQL 代码的阅读顺序要比较清楚(一上来就说 select 选择会有点搞笑) - 强大的 CASE WHEN 函数,其基础可查看链接:
CASE WHEN 基础
当然,打标签这样的操作也可以用强大的 Python 实现,后续博客会有精彩的分享。
效果前后
注意:是需要组合起来考虑,综合性别与年龄,最后以多添加一列的方式来呈现
流程分析 & 实现步骤
效果图中的 category 列很明显是由字母与数字组合而成的,而且类型是字符串 varchar,所以如果我们能够根据列 sex 与 age 来构造出新的两列标签列,在使用 CONCAT() 这个文本处理函数将新生成的两列结合起来那就可以了。
Step 1:构造字母标签列 alpha_label(代码思路 & 效果图 如下)
有点味道了,接下来只需要 concat 一下就可以了吧…
报错!!无法执行
问题探究
CONCAT() 的执行机制:对表中原有的两列或多列进行合并,中间还可以添加自己的定义字符如 CONCAT(A, ‘~’, B) 等。但由代码阅读的顺序可知,SQL 的执行流程为:从(from) 表格中读入数据 --> 最后由 select 来呈现(可以理解成 select 是用来呈现的),而呈现方式中用了两个 case when 而已,并不复杂,关键在于两个 case when 生成的新列并不属于原来的表,原来的表还没有这两列东西,那你 concat 什么。所以,这时候祭出子查询即可轻松破之。
SELECT
*
-- 对新表进行 concat
, CONCAT(new.alpha_label, new.age_label) AS agent_level
FROM
-- 子查询开始
(SELECT
*
, CASE WHEN age BETWEEN 0 AND 13 THEN 'C'
WHEN age BETWEEN 14 AND 18 THEN 'T'
-- 搜索 CASE 的强大得以体现,跨列选择打标签的标准
WHEN sex = 'M' THEN 'M'
WHEN sex = 'F' THEN 'F'
END AS alpha_label -- 字母标签
, CASE WHEN age BETWEEN 18 AND 35 THEN '1'
WHEN age BETWEEN 36 AND 45 THEN '2'
WHEN age >= 46 THEN '3'
-- 处理未成年人:青少年与孩童
WHEN age BETWEEN 13 AND 15 THEN '1'
ELSE '' -- 孩童不做处理
END AS age_label
-- 子查询结束
FROM
mst_users_with_age) AS new
;
上书写代码的方式可能会显得比较占地方,但可读性绝对上乘,而且还有许多意想不到的好处,看起来奇奇怪怪的逗号放在前面也大有玄机!
- 可以直接注释掉一行而不影响其他行
- 可在一行末尾添加注释而不影响其他行
- 可提醒自己不要漏掉逗号
- 跨段函数可用注释标注开始和结束标志,这样在事后检查的时候也很方便
模拟面试
- 现场写代码(已包含不少知识点)
- concat 的作用机理之类的
后记
以上内容为冰山一角,后续会有更多的 Python 爬虫,数据分析,统计学,数据可视化,excel,word,争取数据分析可视化爬取数据以及论文等文章排版方面甚至各种面试一条龙都不用愁。
平时你比较高冷很少点赞关注,其实这篇文章也应该能帮到你吧。
END