使用nvl和max查找唯一值

时间:2016-03-23 14:24:17

标签: sql oracle plsql

我想只选择输入日期在beg_date和end_date之间的行,但是因为有多行可以为true,所以如果有多行,我想选择最大的end_date。有了以下信息,我希望只选择第一行,即使日期在第二行' s beg_date和end_date之间。

此外,当我使用 max 函数时,我最终可能会选择空值,并且不会返回grp_id,因为end_date为null。我可能不得不在某处使用 nvl 功能,但不确定在哪里。

Customer_Nbr:20080909

日期:95年6月25日

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

到目前为止,这可以获得非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 个答案:

答案 0 :(得分: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

你需要在select的每一行知道max_end,如果你使用解析函数over(partition ..),你有max()函数在overy行上有相同的结果,然后只通过end_date = max_end_date过滤

(输入日期06/27/2004必须在nvl函数中相同)

答案 1 :(得分:0)

你可以用这个:

start_date和nvl之间的日期(end_date,date)