2014-09-05 50 views
2

我正在使用的软件要求获取有序数据集的第一个和最后一个记录。数据集按日期列排序。Oracle SQL从有序数据集中获取第一个和最后一个记录

I中的数据有:

--table "notes": 
-- ordered by this 
--    | 
--    V 
note_id  date_created attribute1 attribute2 ... -- I want to get 
----------------------------------------------------- 
596   2014/01/20 ...   ...   ... -- <- this 
468   2014/02/28 ...   ...   ... 
324   2014/03/01 ...   ...   ... 
532   2014/04/08 ...   ...   ... 
465   2014/05/31 ...   ...   ... -- <- and this 

所需的输出:

596   2014/01/20 ...   ...   ... 
465   2014/05/31 ...   ...   ... 
+0

哪个版本的oracle? – Vargan 2014-09-05 11:26:30

+0

@Vargan:11gR2,但我认为这是一个普通的Oracle SQL问题。所以后来的访客也可以受益。 – Krumia 2014-09-05 11:27:16

回答

7

您可以使用窗口函数:

select t.* 
from (select t.*, row_number() over (order by date_created) as seqnum, 
      count(*) over() as cnt 
     from t 
    ) t 
where seqnum = 1 or seqnum = cnt; 

在Oracle 12,你也可以这样做:

select t.* 
from t 
order by date_created 
fetch first 1 rows only 
union all 
select t.* 
from t 
order by date_created desc 
fetch first 1 rows only; 
+0

Oracle有ROWNUM,所以可以简化第一个查询 – Bulat 2014-09-05 11:42:37

+0

@Bulat使用row_number比使用rownum更安全,解析函数适用于结果集准备好后的结果集,但oracle docs不会告诉我们rownum何时生成 – zaratustra 2014-09-05 12:19:43

+0

只要它为所有行生成,我就没有看到任何区别。 row_number()是一个更好的解决方案,因为它不是Oracle特定的。 – Bulat 2014-09-05 12:35:26

4

如果我说得对,试试这个:

select t1.* 
    from YOUR_TABLE t1 
    , (
     select min(note_id) keep(dense_rank first order by date_created) min_val 
      , max(note_id) keep(dense_rank last order by date_created) max_val 
      from YOUR_TABLE 
     ) t2 
where t1.note_id = t2.min_val 
    or t1.note_id = t2.max_val 
相关问题