【面試準備】窗口函數學習

昨天面試,技術問的比較簡單,甚至沒有問算法。業務的話,應該是我沒有過面的主要原因,後續展開分析

#技術:唯一難倒我的是一個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()`函數會給他們相同的排名,這樣每個部門可能會有超過兩名員工被選出。如果你希望在年齡相同的情況下進一步篩選,你可能需要添加額外的條件來決定哪些員工被包括在內。

 

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