发现同事在代码里写了大量日志打印,导致磁盘空间爆满,提醒他反被说“你懂什么,日志越多越好排查”。。
刚看到个贴子,说有程序员在代码里狂打日志,把服务器磁盘干爆了,提醒他还被怼:“你懂啥,日志多好排查!”
这事说到底还是对“日志”这东西理解太浅了。日志确实重要,但是“有效”日志重要,不是堆满屏的info、debug。你整一个接口几百行打印,跟监控台看电视剧一样,谁排查谁头疼。真出事时,光翻日志就够喝一壶的了。
网友的回复我看了,有支持也有喷的。我倒是觉得,这种事不能一味怼,要讲逻辑——好排查不等于瞎打印,你debug能加,生产环境也不清理,那是技术懒政。
还有,日志爆盘不仅影响服务,还可能拖垮整条链路,真不是小事。程序员不能只图自己写得爽,也要对系统稳定性负责。【备注:文末可领最新资料】
面试题:部门工资前三高的所有员工
今天我们来聊一道SQL算法题,名字听着有点长——“部门工资前三高的所有员工”,不过别被名字吓到,其实逻辑不难,就是稍微绕点。
我自己当年面字节跳动就被问过这道题,那会儿脑子一抽写了个 LIMIT 3,当场被面试官当小学鸡锤了半小时 😂。所以今天就来把这个题讲明白,别让大家再踩我踩过的坑。
题目需求是这样:每个部门里,找出工资排前三的员工,不管几个,薪资一样的都要出来,也就是说可能会多于3个。
别急,我们先不看答案,我来带大家按程序员的习惯一层层拆。
第一步,数据理解
假设我们有两个表:
Employee(
id INT,
name VARCHAR,
salary INT,
departmentId INT
)
Department(
id INT,
name VARCHAR
)
常规操作,先把 Employee 和 Department 连上:
SELECT e.name, d.name as department, e.salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
这个先别动,等下是我们最终查询要用的模板。
第二步,找工资排前三
别以为 LIMIT 3 就能解决,这是每个部门各取3个高薪员工,不能全局取3个!
那怎么搞?
👉 我们得用窗口函数 DENSE_RANK() 或 ROW_NUMBER(),这个玩意我之前讲过很多次,按某个分组内排序非常香!
我们给每个部门的员工打一个薪资排名:
SELECT *,
DENSE_RANK() OVER (PARTITIONBY departmentId ORDERBY salary DESC) as rnk
FROM Employee
这里解释下,PARTITION BY departmentId 是“按部门分组”,每组里面 ORDER BY salary DESC 是“薪资降序”,DENSE_RANK() 是“并列排名不跳过”。
比如部门A有工资是 10000、10000、9000、9000、8500,排出来就是:1、1、2、2、3,这样就对了!
第三步,加个子查询过滤
上一步我们把排名搞出来了,那现在就好说了,只要保留排名 ≤ 3 的就OK:
SELECT *
FROM (
SELECT *,
DENSE_RANK() OVER (PARTITIONBY departmentId ORDERBY salary DESC) as rnk
FROM Employee
) e
WHERE rnk <= 3
等等!别忘了还要连上部门名字啊!我们最开始那句 JOIN 就该派上用场了:
SELECT d.name as Department, e.name as Employee, e.salary
FROM (
SELECT *,
DENSE_RANK() OVER (PARTITIONBY departmentId ORDERBY salary DESC) as rnk
FROM Employee
) e
JOIN Department d ON e.departmentId = d.id
WHERE e.rnk <= 3
🎉 完成!
这道题面试的时候特容易出错,因为很多人第一反应是搞个 GROUP BY 然后 ORDER BY salary LIMIT 3,结果全局取了3个员工,部门信息直接混乱。
我当时面试的时候差点写了这样一句鬼话:
SELECT * FROM Employee ORDERBY salary DESCLIMIT3;
然后面试官看完沉默了5秒,说:“你确定每个部门都有?”
我:……
✅ 技术点小结:
1)别乱用 LIMIT,它是全局生效的,不按部门!
2)窗口函数是个好东西,尤其是 DENSE_RANK(),分组排序神器!
3)子查询别怕写,看清需求,该嵌套就得嵌套!
对了,有朋友问,ROW_NUMBER() 行不行?可以是可以,但会漏人。比如并列第一有3人,ROW_NUMBER()就排出1、2、3,而不是1、1、1,导致只保留1、2、3号,漏掉了后面该并列的。
所以选 DENSE_RANK() 是为了保留并列排名。
最后,送大家一个脑子记忆口诀:
“一窗口分组排,二子查询筛,三连上部门表,答案它就来!”
-END-
我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领