点击上方【蓝色】字体 关注我们

01 场景描述
02 数据准备
-- 创建表CREATE TABLE employees (employee_id INT,department_id INT,row_number INT,column_number INT);-- 插入示例数据INSERT INTO employees VALUES(1, 1, 1, 1),(2, 1, 1, 2),(3, 1, 2, 1),(4, 1, 2, 2),(5, 2, 1, 1),(6, 2, 1, 3),(7, 2, 3, 1),(8, 2, 3, 3),(9, 3, 2, 2),(10, 3, 2, 3);

03 问题分析
步骤一:使用分析函数计算每个部门内每行数据对应的最大行号和最大列号
-- 使用分析函数计算每个部门内每行对应的最大行号和最大列号SELECTemployee_id,department_id,row_number,column_number,MAX(row_number) OVER (PARTITION BY department_id) AS max_row_department,MAX(column_number) OVER (PARTITION BY department_id) AS max_col_departmentFROM employees;

-- 根据角落座位条件筛选员工SELECTemployee_id,department_idFROM (SELECTemployee_id,department_id,row_number,column_number,MAX(row_number) OVER (PARTITION BY department_id) AS max_row_department,MAX(column_number) OVER (PARTITION BY department_id) AS max_col_departmentFROM employees) subqueryWHERE (row_number = 1 OR row_number = max_row_department)AND (column_number = 1 OR column_number = max_col_department);

在这一步中,首先在子查询里复用了第一步的结果,然后在外层查询中,通过 WHERE
子句设定角落座位的条件,即行号为 1 或者等于所在部门的最大行号,并且列号为 1 或者等于所在部门的最大列号,筛选出符合条件的员工记录,也就是找出了每个部门坐在角落位置的员工。
04 小 结
文章通过分析函数巧妙解决了一种员工座位安排中查找各部门角落座位员工的问题,并且通过展示中间结果能更直观地看到每一步的数据变化和计算逻辑。文章中的问题也可以利用关联形式进行求解,具体SQL代码如下:
-- 子查询按部门找出最大行号和最大列号SELECT department_id, MAX(row_number) AS max_row, MAX(column_number) AS max_colFROM employeesGROUP BY department_id;-- 主查询筛选出各部门角落座位的员工SELECT e.employee_id, e.department_idFROM employees eJOIN (SELECT department_id, MAX(row_number) AS max_row, MAX(column_number) AS max_colFROM employeesGROUP BY department_id) m ON e.department_id = m.department_idWHERE (e.row_number = 1 OR e.row_number = m.max_row)AND (e.column_number = 1 OR e.column_number = m.max_col);
往期精彩
会飞的一十六
扫描右侧二维码关注我们
点个【在看】 你最好看

文章转载自会飞的一十六,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





