0

我有一个表,其中包含加薪历史 (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

但这不起作用。它返回 2002 年 1 月 1 日的inc_amount0 inc_date。显然,Oracle 将ROWNUM它们存储在原始表中,而不是查询返回的数据集。

4

5 回答 5

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;
于 2013-07-31T16:21:05.033 回答
4

您应该可以为此使用子查询:

SELECT * FROM
  (SELECT epi.inc_amt FROM emp_pay_inc epi ORDER BY epi.inc_date DESC)
WHERE ROWNUM = 1;
于 2013-07-31T16:14:30.940 回答
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)

如果多条记录具有相同的日期并且您需要所有记录,这可能会更好

于 2013-07-31T16:19:02.933 回答
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 如果你想要一些特定的 id

于 2013-07-31T16:14:24.583 回答
0

这是一个想法:

select emp_id, inc_date, inc_amount, rank() over (order by inc_date desc)
from emp_pay_inc 
where rank = 1 
于 2013-07-31T16:53:54.777 回答