2014-09-05 51 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 
相關問題