You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用SQL检测数值随时间下降并查询薪资降低的员工姓名

SQL查询薪资下降员工的实现方法

场景说明

涉及的数据库结构如下:
数据库结构
基础关联查询的结果结构如下:
sql查询结果
你已编写的基础关联SQL语句:

SELECT employees.emp_no, first_name, last_name, salary, from_date, to_date, hire_date 
from employees
INNER JOIN salaries ON employees.emp_no = salaries.emp_no;

实现方案

检测薪资下降的核心逻辑为:对同一员工的薪资记录按生效时间排序,判断是否存在后生效的薪资低于前一次薪资的情况,符合条件的员工即为目标结果。

方案1:窗口函数实现(适配MySQL 8.0+、PostgreSQL、SQL Server等支持窗口函数的主流数据库)

通过LAG窗口函数分组取同员工上一次的薪资值,对比筛选后去重即可:

SELECT DISTINCT e.first_name, e.last_name
FROM employees e
INNER JOIN (
    SELECT
        emp_no,
        salary,
        -- 按员工编号分组,按薪资生效日期升序排序,取同组上一条记录的薪资值
        LAG(salary) OVER(PARTITION BY emp_no ORDER BY from_date) AS prev_salary
    FROM salaries
) s ON e.emp_no = s.emp_no
-- 筛选当前薪资低于上一次薪资的记录
WHERE s.salary < s.prev_salary;

方案2:自关联实现(适配不支持窗口函数的老版本数据库,如MySQL 5.x)

通过薪资表自关联匹配同员工不同时段的薪资记录,对比筛选后去重即可:

SELECT DISTINCT e.first_name, e.last_name
FROM employees e
INNER JOIN salaries s1 ON e.emp_no = s1.emp_no
-- 关联同员工更晚生效的薪资记录
INNER JOIN salaries s2 ON e.emp_no = s2.emp_no AND s2.from_date > s1.from_date
-- 筛选晚生效薪资低于更早薪资的记录
WHERE s2.salary < s1.salary;

内容的提问来源于stack exchange,提问作者Michel Machado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:27:01