2016-03-23 170 views
2

我想只選擇輸入日期在beg_date和end_date之間的行,但由於有多行,這可能是真的,我想選擇最大end_date如果有是多行。有了以下信息,我希望只選擇第一行,即使日期介於第二行的beg_date和end_date之間。使用nvl和max查找唯一值

此外,當我使用功能時,我可以最終選擇空值,並且由於end_date爲空而不返回grp_id。我可能不得不在某處使用功能,但不知道在哪裏。

Customer_Nbr:20080909

日期:25軍95

Customer_Nbr Grp_Id Beg_Date End_Date 
12345689  9  21-MAY-95 24-FEB-97 
12345689  9  21-MAY-95 24-FEB-96 
12345689  9  27-JUN-04 null 

到目前爲止,這部作品得到一個非空END_DATE值。

SELECT grp_id 
    FROM table1 
    WHERE customer_nbr = '12345689' 
    AND to_date('06/27/2004','MM/DD/YYYY') 
    BETWEEN beg_date AND nvl(end_date,to_date('12/31/9999','MM/DD/YYYY')); 

回答

2
SELECT grp_id 
    FROM (SELECT grp_id, MAX(end_date) over(PARTITION BY 1) AS max_end_date, 
       end_date 
      FROM table1 
      WHERE customer_nbr = '12345689' 
      AND to_date('06/27/2004', 'MM/DD/YYYY') BETWEEN beg_date AND 
       nvl(end_date, to_date('06/27/2004', 'MM/DD/YYYY'))) 
WHERE end_date = max_end_date 

你需要知道的每一行選擇一次max_end,如果u使用瞭解析函數(分區..),u有最大值與卵巢中排相同的結果()函數,然後只能通過過濾END_DATE = max_end_date

(輸入日期2004年6月27日通過必須在相同NVL函數)

0

您可以使用此:

如果start_date和NVL(END_DATE,日期)之間的日期