查询以获取与SQL中的Max值对应的行

时间:2014-11-25 18:27:31

标签: sql oracle

有一个带有列

的表time_periods
time_period    START_DATE    PAY_DATE
1          01-DEC-2014     02-DEC-2014
1          12-NOV-2014     01-DEC-2014

PEOPLE_TABLE WITH COLUMNS

TIME_PERIOD   EMP_NUM  emp_name
1               101    xyz

我创建了一个查询:

select pt.emp_name,
max(tp.start_date),
tp.pay_date
from time_periods tp,
people_table pt
where tp.time_period=pt.time_period
group by pt.emp_name,tp.pay_date

但这是回归

emp_name    START_DATE    PAY_DATE
xyz          01-DEC-2014   02-DEC-2014
xyz          12-NOV-2014     01-DEC-2014

但这会返回两行....我需要的只是一行,其中max(start_date)和pay_date对应于此。那就是:

emp_name    START_DATE    PAY_DATE
xyz          01-DEC-2014   02-DEC-2014

1 个答案:

答案 0 :(得分:2)

在Oracle中,您可以使用分析函数:

select emp_name, max_start_date, pay_date
from (
    select pt.emp_name, 
           tp.start_date,
           tp.pay_date,
           rank() over(partition by pt.emp_name 
                       order by tp.start_date desc) rw,
    from time_periods tp, people_table pt
    where tp.time_period=pt.time_period
) where rw = 1;

RANK()可能会为同一个emp_name提供多行(如果它们都具有相同的start_date

如果每个emp_name

只需要一行,则可以使用 ROW_NUMBER()代替 RANK()