仅使用ORDER BY检索第一行

时间:2013-07-31 16:11:01

标签: sql oracle

我有一个包含工资增长历史(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存储在原始表中,而不是查询返回的数据集。

5 个答案:

答案 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