2012-03-19 11 views
6

मुझे यह कहकर शुरू करना है कि मुझे पता है कि मेरा विषय बिल्कुल सही नहीं है लेकिन मुझे नहीं पता कि इसे कैसे वाक्यांशित किया जाए।एसक्यूएल दो बार पंक्तियों को संसाधित करने से जुड़ते हैं

बजाय समझाने के लिए मुझे क्या करना कोशिश कर रहा हूँ कोशिश, मैं आपको दिखाते हैं:

नीचे मेरी मेज से उचित डेटा का एक टुकड़ा है (मैं मूल्यों के लिए दिनांक/समय क्षेत्रों ट्रिम में बदलने का उपयोग कर रहा हूँ हमें चाहिए। सभी तिथियां "एक्सएक्स/एक्सएक्स/XXX एक्स 00: 00: 00.000" हैं और हर बार "01/01/1900 एक्सएक्स: एक्सएक्स: एक्सएक्सओएस" है जहां एक्सएक्स एक वास्तविक मूल्य है और 00 प्लेसहोल्डर है)।

CALLNBR  DATE  START  END 
----------- ---------- ---------- ---------- 
0000182867 03/07/2012 10:55:00 12:20:00 
0000182867 03/07/2012 12:20:00 13:00:00 
0000182779 03/06/2012 14:29:00 15:03:00 
0000182749 03/06/2012 15:15:00 15:30:00 
0000182748 03/07/2012 10:40:00 12:30:00 
0000182748 03/07/2012 12:30:00 13:20:00 
0000182740 03/06/2012 11:00:00 11:30:00 
0000182740 03/06/2012 11:30:00 12:00:00 
0000182735 03/07/2012 09:10:00 10:00:00 
0000182735 03/07/2012 10:00:00 10:40:00 
0000182735 03/06/2012 14:40:00 15:10:00 
0000182735 03/06/2012 15:10:00 15:30:00 
0000182735 03/06/2012 15:30:00 16:45:00 

मुझे समय को स्ट्रिंग करने की आवश्यकता है जहां एक रिकॉर्ड अंत समय अगले के प्रारंभ समय है। मैं एक परिणाम के लिए इसी तरह की प्राप्त करने के लिए कोशिश कर रहा हूँ (CALLNBR 182,735 छानने का आधार):

CallNbr  DATE  t1Start t1end  t2Start t2end  t3Start t3end 
----------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 
0000182735 03/06/2012 14:40:00 15:10:00 15:10:00 15:30:00 15:30:00 16:45:00 
0000182735 03/07/2012 09:10:00 10:00:00 10:00:00 10:40:00 NULL  NULL 

लेकिन परिणाम मैं हो रही है:

CallNbr  DATE  t1Start t1end  t2Start t2end  t3Start t3end 
----------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 
0000182735 03/06/2012 14:40:00 15:10:00 15:10:00 15:30:00 15:30:00 16:45:00 
0000182735 03/06/2012 15:10:00 15:30:00 15:30:00 16:45:00 NULL  NULL 
0000182735 03/07/2012 09:10:00 10:00:00 10:00:00 10:40:00 NULL  NULL 

मेरे मुद्दा बीच रिकॉर्ड, जिनके मान में हैं के साथ है पहले रिकॉर्ड लौटे:

0000182735 03/06/2012 15:10:00 15:30:00 15:30:00 16:45:00 NULL  NULL 

दुर्भाग्य से मैं t3Start या t3End द्वारा NULLS को दबाने नहीं कर सकते क्योंकि उस के लिए रिकॉर्ड (इस उदाहरण में) 2012/03/07 को खत्म करेगा। (मेरे CONVERT'ers इसे और अधिक पठनीय बनाने के लिए, मैं बाहर अलग करना रहा हूँ)

0000182735 03/07/2012 09:10:00 10:00:00 10:00:00 10:40:00 NULL  NULL 

और अब चयन के लिए:

SELECT 
     t1.CallNbr, 
     t1.STRTDATE, 
     t1.strttime as t1Start, 
     t1.endtme as t1end, 
     t2.strttime as t2Start, 
     t2.endtme as t2end, 
     t3.strttime as t3Start, 
     t3.endtme as t3end 
    FROM  TableA t1 
    INNER JOIN TableA t2 ON t1.endtme = t2.strttime 
         AND t1.strtdate = t2.strtdate 
         AND t1.CALLNBR = t2.CALLNBR 
         AND t1.LINITMTYP = 'L' 
    LEFT JOIN TableA t3 ON t3.CALLNBR = t2.CALLNBR 
         AND t3.strttime = t2.endtme 
         AND t3.strtdate = t1.strtdate 
    WHERE t1.CALLNBR = '0000182735' 
    ORDER BY t1.CALLNBR, t1.strtdate 

भले ही आप मदद नहीं कर सकता, समय निकालने के लिए धन्यवाद इसके माध्यम से पढ़ने के लिए।

धन्यवाद,

फिलिप

+1

एसक्यूएल में से कौन सा स्वाद में जोड़ा उपयोग कर किसी भी ओवरलैप की अनुमति नहीं दे की अतिरिक्त सुरक्षा जोड़ सकते हैं? –

+0

सुझाव: तिथि/समय पर विभिन्न जोड़ों को उस खंड में ले जाएं जहां मुख्य जुड़ें सिर्फ आईडी पर हैं। निदान/इलाज के लिए आसान हो सकता है। –

+1

यदि आपको कोई फर्क नहीं पड़ता है, तो मैंने आपकी क्वेरी को दोबारा सुधार दिया है। दो चीजें: 1. आपकी समस्या में 'LINITMTYP 'महत्वपूर्ण है? 2. आप पहले (आंतरिक) का उपयोग क्यों कर रहे हैं और दूसरे में शामिल हो गए हैं? – biziclop

उत्तर

1

आप ROW_NUMBER() कार्यक्षमता का उपयोग करने में सक्षम हैं, तो मैं निम्नलिखित करना होगा। यह सुनिश्चित करता है कि क्वेरी केवल शुरुआत से ही खींचती है, न कि बीच में। आप संभवतः इस तरह से क्वेरी को साफ़ कर सकते हैं, लेकिन मुझे यकीन नहीं है। आप सभी की जरूरत चाहिए ROWNUM = 1 है, लेकिन आप माता-पिता तालिका ROWNUM> बच्चे मेज ROWNUM कि मैं टिप्पणी

SELECT t1.CallNbr, t1.StrtDate, t1.StrtTime, t1.EndTime, t1.LINITMTYP, 
    ROW_NUMBER() OVER (PARTITION BY t1.CALLNBR, t1.strtdate ORDER BY t1.StrtTime) AS RowNum 
INTO #MyTemp 
FROM TableA AS t1 

SELECT 
     t1.CallNbr, 
     t1.STRTDATE, 
     t1.strttime as t1Start, 
     t1.endtme as t1end, 
     t2.strttime as t2Start, 
     t2.endtme as t2end, 
     t3.strttime as t3Start, 
     t3.endtme as t3end 
    FROM #MyTemp t1 
     JOIN #MyTemp t2 ON t1.endtme = t2.strttime 
        AND t1.strtdate = t2.strtdate 
        AND t1.CALLNBR = t2.CALLNBR 
        AND t1.LINITMTYP = 'L' 
        --You could add extra security using the following 
        --AND t2.RowNum > t1.RowNum 
    LEFT JOIN #MyTemp t3 ON t3.CALLNBR = t2.CALLNBR 
         AND t3.strttime = t2.endtme 
         AND t3.strtdate = t1.strtdate 
         --You could add extra security using the following 
         --AND t3.RowNum > t2.RowNum 
    WHERE t1.CALLNBR = '0000182735' 
     AND t1.RowNum = 1 
    ORDER BY t1.CALLNBR, t1.strtdate 
+0

क्या आपका मतलब 'row_number() से अधिक नहीं है (CALLNBR द्वारा विभाजन, START द्वारा DATE का आदेश)'? (मैंने वास्तविक तालिका से कॉलम नामों का उपयोग किया) – Aprillion

+0

@deathApril याहू मुझे नहीं पता कि मैं क्या सोच रहा था :)। अब –

+0

तय किया गया था कि यह बिल्कुल था। धन्यवाद! और मैंने ओवरवर का उपयोग करने की कोशिश की लेकिन इसे काम नहीं कर सका ... लेकिन मैंने कभी भी टेबल बनाने के लिए इसका इस्तेमाल करने की कोशिश नहीं की, फिर उस टेबल से जुड़ें। सीखने के लिए हमेशा कुछ नया। फिर से धन्यवाद। –

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