2010-08-10 98 views
1

我正在Oracle數據庫上運行請求。 我的表中的一個包含時隙的元件,並且可以存在於相同的元素幾個時隙,使得下面的例子是正確的:如何返回SQL中的maxvalue或nullvalue?

ID ELEMENT_ID BEGIN_DATE END_DATE 
-------------------------------------------- 
1  1    01/01/2007 01/06/2007 
2  1    01/06/2007 

3  2    01/01/2006 01/07/2006 
4  2    01/07/2006 31/12/2006 

爲其END_DATE未填充的時隙意味着它仍然是運行(所以,這是Element的最新時間段)。

因此,當我搜索最近的每個元素END_DATE,我想獲得行#2和#4。 所以,我面臨的問題是將NULL視爲最高END_DATE ...

是否可以在一個SQL請求中執行此操作?

當然我想簡單:

SELECT MAX(END_DATE) FROM ...

,但它不是足夠多,因爲NULL值。

在此先感謝。

回答

6

更改爲將來的某個值的空值

SELECT MAX(NVL(END_DATE,SYSDATE + 1) ... 
+0

這裏假設所有的你end_dates在未來,這似乎是基於你的例子。 – LesterDove 2010-08-10 15:41:46

+0

這是這種情況,我的end_dates在將來都沒有。感謝該片段,它工作正常!不過,我仍然遇到最後一個小問題,因爲我的下一步是選擇整個行以標識MAX(END_DATE)...因此,在'END_DATE'中插入假日期與' SELECT * FROM MyTable WHERE END_DATE =(SELECT MAX(...));'最後一個提示對我來說? :) – Clem 2010-08-10 15:59:43

+0

從技術上講,只要您將蘋果與蘋果進行比較並替換比較兩側的空值,就可以使用您的方法。 SELECT * FROM MyTable WHERE NVL(END_DATE,SYSDATE + 1)=(SELECT MAX(。 ..)); 有可能是其他一些方法... – LesterDove 2010-08-10 16:11:34

3

嘗試:

select element_id, max(coalesce(end_date, date '4000-12-31')) as max_end_date 
from ... 
3

使用ORDER BY與NULLS FIRST,如:

SELECT DISTINCT 
     FIRST_VALUE(id) 
     OVER (PARTITION BY element_id 
      ORDER BY end_date DESC NULLS FIRST) latest_id, 
     element_id, 
     FIRST_VALUE(begin_date) 
     OVER (PARTITION BY element_id 
      ORDER BY end_date DESC NULLS FIRST) latest_id, 
     FIRST_VALUE(end_date) 
     OVER (PARTITION BY element_id 
      ORDER BY end_date DESC NULLS FIRST) latest_id 
FROM ... 


ID ELEMENT_ID BEGIN_DATE END_DATE 
-------------------------------------------- 
2  1    01/06/2007 
4  2    01/07/2006 31/12/2006 
+0

太好了!我編碼了上一個,但下一次請記住你的方法!謝謝。 – Clem 2010-08-11 07:12:01