【问题标题】:Analytic functions and means of window clause窗口子句的解析功能和方法
【发布时间】:2022-11-14 04:32:11
【问题描述】:

我正在使用 Oracle 和 SQL Developer。我已经下载了 HR 模式,需要用它做一些查询。现在我正在与表员工一起工作。作为用户,我需要查看其工资与相应部门所有后来聘用的同事的平均工资之间差距最大的员工。这似乎很有趣,也很复杂。我已经阅读了一些文档并尝试过,例如 LEAD(),它可以同时提供对多行表的访问:

SELECT
    employee_id,
    first_name
    || ' '
    || last_name,
    department_id,
    salary,
    hire_date,
    LEAD(hire_date)
    OVER(PARTITION BY department_id
         ORDER BY
             hire_date DESC
    ) AS Prev_hiredate
FROM
    employees
ORDER BY
    department_id,
    hire_date;

这显示了部门中每个人的后来雇用人员的雇用率。我也尝试使用窗口子句来理解它的概念:

SELECT
    employee_id,
    first_name
    || ' '
    || last_name,
    department_id,
    hire_date,
    salary,
    AVG(salary)
    OVER(PARTITION BY department_id
         ORDER BY
             hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS avg_sal
FROM
    employees
ORDER BY
    department_id,
    hire_date;

这显示了当前行之前所有行和当前行的平均工资,因此如果我们部门中有 2 个人的工资分别为 13000 和 6000,我们将收到前 13000 和第二 (13000+6000)/2=9500 的 avg_sal等等。然而,这并不是我所需要的。我需要收到这样的东西:

应该如何查看我的查询以获得适当的结果(可以是具有分析功能的不同解决方案,但必须包含窗口子句)?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以获得被雇用的员工的平均工资之前当前员工只需调整您的 avg 的 rows 子句:

        AVG(salary) OVER(
            PARTITION BY department_id
            ORDER BY hire_date 
            ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
        ) AS avg_sal
    

    1 PRECEDING 子句告诉数据库不要在窗口中包含当前行。

    【讨论】:

      猜你喜欢
      • 2022-11-15
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 2010-12-19
      相关资源
      最近更新 更多