Как вернуть maxvalue или nullvalue в SQL? - PullRequest
1 голос
/ 10 августа 2010

Я выполняю запросы к базе данных Oracle.Одна из моих таблиц содержит временные интервалы для Элементов, и для одного и того же Элемента может быть несколько временных интервалов, поэтому следующий пример верен:

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 не заполнен, означает, чтоон все еще работает (так что это самый последний временной интервал для элемента).

Таким образом, когда я ищу самые последние END_DATE для каждого элемента, я хочу получить строки # 2 и #4.Итак, проблема, с которой я сталкиваюсь, состоит в том, чтобы рассматривать NULL как самое высокое END_DATE ...

Возможно ли сделать это в одном запросе SQL?

Конечно, я попыталсяпросто:

SELECT MAX(END_DATE) FROM ...

но этого не достаточно из-за значений NULL.

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 10 августа 2010

Измените нулевые значения на некоторые будущие значения

SELECT MAX(NVL(END_DATE,SYSDATE + 1) ...
3 голосов
/ 11 августа 2010

Используйте 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
3 голосов
/ 10 августа 2010

Попробуйте:

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