你可以使用ROW_NUMBER()
函数两次,首先对每个empid
的最近3条记录进行过滤,然后从这些记录中获取最早的一条:
SELECT empid,
change_date,
salary
FROM (
SELECT empid,
change_date,
salary,
ROW_NUMBER() over (PARTITION BY empid ORDER BY change_date ASC) AS rn2
FROM (
SELECT empid,
change_date,
salary,
ROW_NUMBER() over (PARTITION BY empid ORDER BY change_date DESC) AS rn1
FROM emp_sal
)
WHERE rn1 <= 3
)
WHERE rn2 = 1
ORDER BY empid;
对于以下示例数据:
CREATE TABLE emp_sal (empid, change_date, salary) AS
SELECT 1, DATE '2023-01-01', 1000 FROM DUAL UNION ALL
SELECT 1, DATE '2023-02-01', 1400 FROM DUAL UNION ALL
SELECT 1, DATE '2023-03-01', 1450 FROM DUAL UNION ALL
SELECT 1, DATE '2023-04-01', 1500 FROM DUAL UNION ALL
SELECT 2, DATE '2023-11-01', 2500 FROM DUAL UNION ALL
SELECT 2, DATE '2023-12-01', 2400 FROM DUAL UNION ALL
SELECT 2, DATE '2023-12-15', 2200 FROM DUAL UNION ALL
SELECT 3, DATE '2023-05-01', 500 FROM DUAL UNION ALL
SELECT 3, DATE '2023-06-01', 640 FROM DUAL UNION ALL
SELECT 4, DATE '2023-10-01', 3000 FROM DUAL;
上述查询将输出如下结果:
| EMPID | CHANGE_DATE | SALARY |
|-------|-------------------|--------|
| 1 | 2023-02-01 00:00:00 | 1400 |
| 2 | 2023-11-01 00:00:00 | 2500 |
| 3 | 2023-05-01 00:00:00 | 500 |
| 4 | 2023-10-01 00:00:00 | 3000 |
在线运行示例