【面试准备】窗口函数学习

昨天面试,技术问的比较简单,甚至没有问算法。业务的话,应该是我没有过面的主要原因,后续展开分析

#技术:唯一难倒我的是一个sql

##题目:员工表找出每个部门员工年龄最大的两个员工。

在MySQL中,你可以使用窗口函数来查询每个部门年龄最大的两名员工。MySQL 8.0及以上版本支持窗口函数。以下是一个使用`ROW_NUMBER()`和`DENSE_RANK()`窗口函数的示例SQL查询:

 

SELECT id, name, age, department_id
FROM (
    SELECT id, name, age, department_id,
           DENSE_RANK() OVER (PARTITION BY department_id ORDER BY age DESC) AS rank
    FROM employees
) AS ranked_employees
WHERE rank <= 2;

 

这个查询的逻辑如下:

1. 首先,从`employees`表中选择所有员工的`id`、`name`、`age`和`department_id`。
2. 使用`DENSE_RANK()`窗口函数为每个部门的员工按年龄降序分配一个排名(`rank`)。`DENSE_RANK()`函数会给具有相同年龄的员工分配相同的排名,并且排名不会跳过任何数字。
3. 外层查询通过子查询创建了一个名为`ranked_employees`的临时表,这个表包含了原始`employees`表的所有列以及新添加的排名列。
4. 最后,外层查询通过`WHERE`子句筛选出每个部门排名前两名的员工(`rank <= 2`)。

这个查询将返回每个部门年龄最大的两名员工的详细信息。如果你只需要特定的信息,比如只需要员工的姓名和部门,你可以相应地调整`SELECT`子句中的字段。

请注意,这个查询假设`employees`表中的`age`列是唯一的。如果有员工年龄相同,`DENSE_RANK()`函数会给他们相同的排名,这样每个部门可能会有超过两名员工被选出。如果你希望在年龄相同的情况下进一步筛选,你可能需要添加额外的条件来决定哪些员工被包括在内。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章