2012-11-16 11 views
20

Tôi có một bảng có một chuỗi các sự kiện dựa trên thời gian, mỗi sự kiện được kết hợp với ngày bắt đầu và ngày kết thúc. Đối với sự kiện (hiện tại) gần đây nhất, ngày kết thúc là NULL. Tôi đang cố gắng thu gọn các hàng trùng lặp và chỉ hiển thị ngày bắt đầu sớm nhất và ngày kết thúc mới nhất. Với NULL nằm trong trường ngày, hàng đó bị bỏ qua. Tôi có thể giả lập một giá trị ngày kết thúc bằng NVL(), nhưng điều đó sẽ làm cho logic kết thúc trước tìm kiếm và thay thế giá trị đó.Oracle SQL - max() với giá trị NULL

Có cách nào để nhận hàm max() để sắp xếp NULL cao không?

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 
) 

Truy vấn này hoạt động, nhưng giảm hàng ở nơi kết thúc là 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; 

Truy vấn này khắc phục điều đó, nhưng bây giờ tôi có giá trị ngày kết thúc "giả" (9/9/9999). Một cái gì đó tôi không muốn phải mã hóa xung quanh.

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; 

Cảm ơn.

+2

Bạn có rất nhiều câu hỏi mà bạn đã không được chấp nhận một câu trả lời, bạn sẽ nhận được sự quan tâm nhiều hơn trong câu hỏi của bạn nếu bạn có thể quay trở lại và đánh dấu câu trả lời đúng (sử dụng đường viền đánh dấu ở bên trái của câu trả lời). – bendataclear

+1

Tôi thậm chí không biết tính năng Chấp nhận. Sẽ quay lại và cập nhật một số câu trả lời cũ hơn. – nibeck

Trả lời

20

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

UPD:

SQL Fiddle

Oracle 11g R2 Schema Cài đặt:

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 
; 

Query 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, thứ hạng dày đặc. Không lên trên các chức năng phân tích. Sẽ cho nó một whirl và xem nếu tôi có thể làm cho nó hoạt động. Trông đầy hứa hẹn. – nibeck

+2

Điều này hoạt động tuyệt vời! Cảm ơn. – nibeck

+0

Tôi cần cú pháp tương tự cho MS SQL Server ... có ý tưởng nào không? –