programing

Oracle SQL - NULL 값이 있는 max()

minimums 2023. 6. 17. 08:55
반응형

Oracle SQL - NULL 값이 있는 max()

시작 날짜와 종료 날짜가 각각 바인딩된 일련의 시간 기반 이벤트가 있는 테이블이 있습니다.가장 최근(현재) 이벤트의 경우 종료 날짜가 NULL입니다.중복 행을 축소하고 가장 빠른 시작 날짜와 가장 최근의 종료 날짜만 표시하려고 합니다.NULL이 날짜 필드에 있으면 해당 행은 무시됩니다.NVL()로 종료 날짜 값을 더미로 만들 수 있지만, 그러면 프런트 엔드 로직이 해당 값을 검색하고 대체합니다.

NULL을 높게 정렬하기 위해 max() 함수를 얻는 방법이 있습니까?

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" 종료 날짜 값(9999년 9월 9일)이 있습니다.코드를 사용하지 않아도 될 것 같습니다.

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_dt) keep (dense_rank first order by end_dt desc nulls first)

업데이트:

SQL 피들

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 |
select CONG_MEMBER_ID 
,      district
,      min(start_dt)
,      NULLIF(MAX(NVL(end_dt
                     ,TO_DATE('9999-09-09','YYYY-MM-DD')
                     )
                 )
             ,TO_DATE('9999-09-09','YYYY-MM-DD')
             )
from  CONG_MEMBER_TERM
where CONG_MEMBER_ID = 1716
group by CONG_MEMBER_ID
,        district
;

언급URL : https://stackoverflow.com/questions/13417928/oracle-sql-max-with-null-values

반응형