2012-11-16 9 views
20

私は、一連の時間ベースのイベントを持ち、それぞれが開始日と終了日でバインドされたテーブルを持っています。最新の(現在の)イベントの場合、終了日はNULLです。私は重複行を崩壊させ、最も早い開始日と最新の終了日のみを表示しようとしています。日付フィールドにNULLがあると、その行は無視されます。 NVL()で終了日の値をダミーにすることはできますが、フロントエンドロジックがその値を検索して置き換えます。NULL値を持つOracle SQL - max()

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; 

このクエリによって修正されましたが、今では「ダミー」の終了日の値(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; 

ありがとうございます。

+2

あなたは答えを受け入れていない多くの質問を持っているあなたが戻って正しい答えをマークすることができれば、あなたの質問にもっと関心を取得します(回答の左側にある目盛線を使用して)。 – bendataclear

+1

私はAccept機能についても知らなかった。戻って古い回答の一部を更新します。 – nibeck

答えて

20

max(end_dt) keep (dense_rank first order by end_dt desc nulls first)

UPD:

SQL Fiddle

Oracleの11グラム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 

Results

| 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 | 
+0

Hmmmm、高密度ランク。これらの分析関数上ではありません。私にそれを働かせることができるかどうか見て、それを渦巻きにします。期待しているようだ。 – nibeck

+2

これは素晴らしく機能します!ありがとう。 – nibeck

+0

私はこのようなMS SQL Serverのシンタックスを必要としています...考えていますか? –

関連する問題