2012-11-16 19 views
20

मेरे पास एक सारणी है जिसमें समय-सारिणी की एक श्रृंखला है, प्रत्येक एक शुरुआत और समाप्ति तिथि से बंधी है। सबसे हालिया (वर्तमान) घटना के लिए, समाप्ति तिथि पूर्ण है। मैं डुप्लिकेटिव पंक्तियों को ध्वस्त करने की कोशिश कर रहा हूं और केवल सबसे पुरानी प्रारंभ तिथि और नवीनतम समाप्ति तिथि दिखाता हूं। तिथि क्षेत्र में न्यूल होने के साथ, उस पंक्ति को नजरअंदाज कर दिया जाता है। मैं एनवीएल() के साथ एक समाप्ति तिथि मान को डमी कर सकता हूं, लेकिन इससे फ्रंट एंड लॉजिक उस मूल्य को खोजने और बदलने के लिए कारण बन जाएगा।ओरेकल एसक्यूएल - अधिकतम मूल्यों के साथ अधिकतम मूल्य

क्या अधिकतम() फ़ंक्शन को उच्च के रूप में उच्च क्रमबद्ध करने के लिए वैसे भी है?

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, 
     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

मुझे स्वीकृति सुविधा के बारे में भी पता नहीं था। वापस जायेंगे और कुछ पुराने उत्तरों को अपडेट करेंगे। – nibeck

उत्तर

20

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

upd:

SQL Fiddle

ओरेकल 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 

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

हम्मम्म, घने रैंक। इन विश्लेषणात्मक कार्यों पर नहीं। इसे एक भंवर दे देंगे और देखें कि क्या मैं इसे काम कर सकता हूं। उम्मीद तो दिखती है। – nibeck

+2

यह अद्भुत काम करता है! धन्यवाद। – nibeck

+0

मुझे एमएस एसक्यूएल सर्वर के लिए इसी तरह के वाक्यविन्यास की आवश्यकता है ... क्या कोई विचार है? –

संबंधित मुद्दे