我有一个表,它有一系列基于时间的事件,每个事件都包含一个开始和结束日期。对于最近的(当前)事件,结束日期为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 )
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,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_dt)keep(dense_rank first order by end_dt desc nulls first)
原文链接:https://www.f2er.com/oracle/205802.htmlUPD:
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,sysdate-2,sysdate-1) INTO t (val,sysdate-1,null) INTO t (val,e) VALUES (2,sysdate-.5) INTO t (val,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 |