具有空值的Oracle SQL-max()

具有空值的Oracle SQL-max(),sql,oracle,null,Sql,Oracle,Null,我有一个表,其中包含一系列基于时间的事件,每个事件都有一个开始和结束日期。对于最近(当前)的事件,结束日期为空。我试图折叠重复的行,只显示最早的开始日期和最新的结束日期。如果日期字段中为空,则忽略该行。我可以使用NVL()虚拟结束日期值,但这将导致前端逻辑搜索并替换该值 有没有办法让max()函数将NULL排序为高 CREATE TABLE CONG_MEMBER_TERM ( CONG_MEMBER_TERM_ID NUMBER(10) NOT 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
)
此查询有效,但删除结束日期为空的行

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;
这个查询修复了这个问题,但现在我有了一个“虚拟”结束日期值(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;
谢谢。

max(end\u dt)keep(density\u rank first order by end\u dt desc nulls first)

upd:

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
;
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 |
查询1

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
;
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 |

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
;
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 |

你有很多问题没有接受答案,如果你能返回并标记正确的答案(使用答案左边的勾选框),你会对你的问题产生更大的兴趣。我甚至不知道接受功能。将返回并更新一些旧的答案。嗯,密集等级。不了解这些解析函数。我会试试看能不能让它工作。看起来很有希望。我需要MS SQL Server的类似语法。。。有什么想法吗?我发现这个解决方案也适用于Oracle 10g(10.2.0.3.0)。虽然这段代码可以解决这个问题,但它如何以及为什么解决这个问题将真正有助于提高您的文章质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。