从表中选择比较对

时间:2016-05-25 12:06:35

标签: sql oracle select

我真的不知道如何描述它。我有一张桌子:

ID |   Name  | Date
-------------------------
 1 | Mike    | 01.01.2016
 1 | Michael | 02.03.2016
 2 | Samuel  | 23.12.2015
 2 | Sam     | 05.03.2015
 3 | Tony    | 02.04.2012

我想在每对中选择具有最新日期的ID和名称对。结果应该是:

ID |   Name  | Date
-------------------------
 1 | Michael | 02.03.2016
 2 | Samuel  | 23.12.2015
 3 | Tony    | 02.04.2012

我如何实现这一目标?

Oracle Database 11g

4 个答案:

答案 0 :(得分:2)

您可以使用ROW_NUMBER() analytic function

执行此操作
SELECT id, name, "date"
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER ( PARTITION BY id ORDER BY "date" DESC ) rn
  FROM   table_name t
)
WHERE rn = 1

这只需要一次表格扫描(它没有自我加入或相关的子查询 - 即IN (...)EXISTS(...))。

答案 1 :(得分:1)

有一个子选择,返回每个id及其最大日期:

select * from table
where (id, date) in (select id, max(date) from table group by id)

答案 2 :(得分:1)

您可以使用NOT EXISTS()

SELECT * FROM YourTable t
WHERE NOT EXISTS(SELECT 1 FROM YourTable s
                 WHERE t.id = s.id and s.date > t.date)

答案 3 :(得分:0)

可能最有效的方法是:

select t.*
from table t
where t.date = (select max(date) from table t2 where t2.id = t.id);

以及table(id, date)上的索引。

此版本应扫描表并在索引中查找正确的值。

或者,如果只有三列,则可以使用keep

select id, max(date) as date,
       max(name) keep (dense_rank first order by date desc) as name
from table
group by id;

我发现这个版本在Oracle中运行得非常好。