Oracle SQL - max() с значениями NULL
У меня есть таблица, в которой есть серия событий, основанных на времени, каждая связанная с датой начала и окончания. Для последнего (текущего) события конечная дата равна NULL. Я пытаюсь свернуть дублирующие строки и показывать только самую раннюю дату начала и самую последнюю дату окончания. Когда NULL находится в поле даты, эта строка игнорируется. Я могу фикчировать значение даты окончания с помощью NVL(), но это приведет к тому, что логика внешнего интерфейса будет искать и заменять это значение.
Есть ли способ заставить max() сортировать NULL как высокий?
CREATE TABLE CONG_MEMBER_TERM
(
CONG_MEMBER_TERM_ID NUMBER(10) NOT NULL,
CHAMBER_CD VARCHAR2(30 BYTE) NOT NULL,
CONG_MEMBER_ID NUMBER(10) NOT NULL,
STATE_CD CHAR(2 BYTE) NOT NULL,
DISTRICT NUMBER(10),
START_DT TIMESTAMP(6) WITH TIME ZONE,
END_DT TIMESTAMP(6) WITH TIME ZONE
)
Этот запрос работает, но падает строка, где конечная дата имеет значение NULL.
select CONG_MEMBER_ID,
district,
min(start_dt),
max(end_dt)
from CONG_MEMBER_TERM
where CONG_MEMBER_ID = 1716
group by CONG_MEMBER_ID, district;
Этот запрос исправляет это, но теперь у меня есть значение даты окончания "dummy" (9/9/9999). Что-то, чего я бы не хотел кодировать.
select CONG_MEMBER_ID,
district,
min(start_dt),
max(nvl(end_dt, to_date('9/9/9999', 'mm/dd/yyyy')))
from CONG_MEMBER_TERM
where CONG_MEMBER_ID = 1716
group by CONG_MEMBER_ID, district;
Спасибо.
Ответы
Ответ 1
max(end_dt) keep (dense_rank first order by end_dt desc nulls first)
UPD:
SQL Fiddle
Настройка схемы Oracle 11g R2:
CREATE TABLE t
(val int, s date, e date)
;
INSERT ALL
INTO t (val, s, e)
VALUES (1, sysdate-3, sysdate-2)
INTO t (val, s, e)
VALUES (1, sysdate-2, sysdate-1)
INTO t (val, s, e)
VALUES (1, sysdate-1, null)
INTO t (val, s, e)
VALUES (2, sysdate-1, sysdate-.5)
INTO t (val, s, e)
VALUES (2, sysdate-.5, sysdate-.25)
SELECT * FROM dual
;
Запрос 1:
select val, min(s), max(e) keep (dense_rank first order by e desc nulls first)
from t group by val
Результаты:
| VAL | MIN(S) | MAX(E)KEEP(DENSE_RANKFIRSTORDERBYEDESCNULLSFIRST) |
---------------------------------------------------------------------------------------------
| 1 | November, 13 2012 14:15:46+0000 | (null) |
| 2 | November, 15 2012 14:15:46+0000 | November, 16 2012 08:15:46+0000 |