暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL进阶技巧:如何查找每个部门里坐在角落位置的员工?| 员工座位安排问题

会飞的一十六 2025-01-03
81

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

01 场景描述 

假设有一个办公室,员工的座位按照行和列整齐排列,用一张名为 employees 的表来记录员工相关信息,表结构包含 employee_id(员工唯一标识)、department_id(部门标识)、row_number(座位所在行号)、column_number(座位所在列号)这几个字段。现在需要找出坐在角落位置的员工,角落座位即行号为 1 或者最大行号,并且列号为 1 或者最大列号的那些座位对应的员工。

 02 数据准备 

    -- 创建表
    CREATE TABLE employees (
        employee_id INT,
        department_id INT,
        row_number INT,
        column_number INT
    );


    -- 插入示例数据
    INSERT INTO employees VALUES
    (1111),
    (2112),
    (3121),
    (4122),
    (5211),
    (6213),
    (7231),
    (8233),
    (9322),
    (10323);


    03 问题分析 

    步骤一:使用分析函数计算每个部门内每行数据对应的最大行号和最大列号

      -- 使用分析函数计算每个部门内每行对应的最大行号和最大列号
      SELECT 
          employee_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_department
      FROM employees;

      在这个步骤中,通过使用分析函数 MAX(row_number) OVER (PARTITION BY department_id) 和 MAX(column_number) OVER (PARTITION BY department_id),按照 department_id 进行分区,计算出每个部门内每行数据对应的最大行号和最大列号。这样每一行数据都附带了所在部门的最大行号和最大列号信息,为后续判断角落座位做准备。
      步骤二:根据角落座位条件筛选出各部门的角落座位员工 
        -- 根据角落座位条件筛选员工
        SELECT 
            employee_id,
            department_id
        FROM (
            SELECT 
                employee_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_department
            FROM employees
        ) subquery
        WHERE (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_col
          FROM employees
          GROUP BY department_id;


          -- 主查询筛选出各部门角落座位的员工
          SELECT e.employee_id, e.department_id
          FROM employees e
          JOIN (SELECT department_id, MAX(row_number) AS max_row, MAX(column_number) AS max_col
                FROM employees
                GROUP BY department_id) m ON e.department_id = m.department_id
          WHERE (e.row_number = 1 OR e.row_number = m.max_row)
            AND (e.column_number = 1 OR e.column_number = m.max_col);


          往期精彩

          数势科技智能分析AI Agent 何以在市场中脱颖而出?

          数势科技指标平台, 让数据产生最大价值

          数仓建模:一种动态字段表模型设计方法与应用

          解锁SQL无限可能:如何利用HiveSQL实现0-1背包问题?

          SQL进阶技巧:如何根据工业制程参数计算良品率?

          数据科学与SQL:如何利用SQL计算线性回归系数?


          会飞的一十六


          扫描右侧二维码关注我们






          点个【在看】 你最好看






          点击“阅读原文”查看跟多

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

          评论