"这是一份关于谷歌面试题目的资料,主要涉及SQL查询和窗口函数的应用。题目要求找出美国和墨西哥的第三高峰,并按照国家名称升序排列。同时,还提出了一个与之相关的作业问题,即找出每个部门工资前三高的员工。"
在谷歌面试中,数据处理和分析能力是非常重要的技能之一,特别是对于SQL的理解和应用。在这个题目中,面试官通过一个问题考察了应聘者对SQL窗口函数的掌握程度。窗口函数在SQL中用于在结果集上执行计算,而这些计算考虑了行的相对位置。
首先,我们看到创建了一个名为`tb_mountains`的表,存储了山脉的名称、高度和所在国家的信息。然后,插入了几座山的数据,包括美国和墨西哥的高峰。
接着,面试题要求找出每个国家的第三高峰。这里使用了`DENSE_RANK()`窗口函数,它会为每一行分配一个排名,如果有多个行具有相同的值(在这种情况下是高度),它们将获得相同的排名。`PARTITION BY country`将数据按照国家进行分区,`ORDER BY height DESC`则根据高度降序排列。`WHERE rn = 3`则筛选出每个国家排名第三的山。
实现查询时,首先创建了一个名为`t1`的临时表,其中包含了每个山的高度排名。然后,从这个临时表中选择rn等于3的行,也就是每个国家的第三高峰,最后按照国家名字升序排列。
至于作业部分,提出了一个类似的问题,但涉及的是员工工资。这里需要使用窗口函数找出每个部门工资前三高的员工。`ROW_NUMBER()`, `RANK()`, 和 `DENSE_RANK()` 都是窗口函数,它们的区别在于处理相同值时的排名分配:
- `ROW_NUMBER()`: 对每个分区的行提供唯一的数字序列,即使有相同值,也会为每行分配不同的排名。
- `RANK()`: 与`ROW_NUMBER()`相似,但当有相同值时,会跳过下一个排名,例如如果有两个员工工资相同且最高,他们的排名分别是1和2,下一个员工的排名将是4。
- `DENSE_RANK()`: 在遇到相同值时,不跳过排名,而是连续分配相同的数值。比如如果有两个员工工资相同且最高,他们的排名都是1,下一个员工的排名将是2。
因此,要解决作业问题,可以使用`ROW_NUMBER()`或`DENSE_RANK()`,取决于是否希望在工资相同的情况下,员工排名连续。这个问题需要创建和操作`Employee`和`Department`表,填充数据后,使用窗口函数找出每个部门工资前三高的员工。