我有一个包含工资增长历史(Oracle)emp_id
的表 - 用于员工识别,inc_date
- 工资变更的日期和inc_amount - 工资变化金额。我想获得最后inc_amount
inc_date.
emp_pay_inc:
==============================
emp_id | inc_date | inc_amount
==============================
625 | 1/1/2002 | 0
625 | 5/6/2003 | 12000
625 | 1/7/2004 | 35000
625 | 8/1/2009 | -5000
我希望查询执行的伪代码:
SELECT epi.inc_amt
FROM emp_pay_inc epi
WHERE epi.inc_date = MAX(epi.inc_date) -- I know this won't work, it is just for illustration
我尝试了什么(如果同一inc_date
重复emp_id
,我不想使用子查询:
SELECT epi.inc_amt
FROM emp_pay_inc epi
WHERE ROWNUM = 1
ORDER BY epi.inc_date
但这不起作用。它为inc_amount
1/1/2002返回inc_date
0。显然,Oracle将ROWNUM
存储在原始表中,而不是查询返回的数据集。
答案 0 :(得分:5)
我想你想为每个员工提供这个。
SELECT emp_id, inc_date, inc_amount
FROM (SELECT emp_id,
inc_date,
inc_amount,
ROW_NUMBER ()
OVER (PARTITION BY emp_id ORDER BY inc_date DESC)
r
FROM emp_pay_inc)
WHERE r = 1;
答案 1 :(得分:4)
您应该可以使用子查询:
SELECT * FROM
(SELECT epi.inc_amt FROM emp_pay_inc epi ORDER BY epi.inc_date DESC)
WHERE ROWNUM = 1;
答案 2 :(得分:1)
SELECT epi.inc_amt
FROM emp_pay_inc epi
WHERE epi.inc_date = (SELECT MAX(epi.inc_date) from emp_pay_inc)
如果你想要,你也可以添加emp_id,如果你想要一些特定的身份
答案 3 :(得分:1)
Oracle首先选择满足条件的记录(rownum< = 1),然后对它们进行排序。
你可以试试这个:
SELECT * FROM
(SELECT epi.inc_amt
FROM emp_pay_inc epi
ORDER BY epi.inc_date desc)
WHERE ROWNUM = 1
......但我不确定这是否是最佳方式。 你也可以尝试
SELECT epi.inc_amt FROM emp_pay_inc epi
WHERE epi.inc_date =
(SELECT MAX(epi.inc_date) FROM emp_pay_inc epi)
如果几个记录具有相同的日期并且您需要所有记录
,这可能会更好答案 4 :(得分:0)
这是一个想法:
select emp_id, inc_date, inc_amount, rank() over (order by inc_date desc)
from emp_pay_inc
where rank = 1