31

一連の時間ベースのイベントを含むテーブルがあり、それぞれが開始日と終了日でバインドされています。最新 (現在) のイベントの場合、終了日は 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;

このクエリはそれを修正しますが、現在は「ダミー」の終了日の値 (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;

ありがとう。

4

2 に答える 2

30

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 |
于 2012-11-16T14:09:37.243 に答える