2010-11-01 7 views
12

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

तो, यहाँ दो तालिकाओं के लिए कुछ नकली डेटा और वांछित आउटपुट है:

बंद मामले (तालिका A)

 
| id | resolution |   timestamp   | 
------------------------------------------------ 
| 1 |  solved | 2006-10-05 11:55:44.888153 | 
| 2 |  closed | 2007-10-07 12:34:17.033498 | 
| 3 | trashed | 2008-10-09 08:19:36.983747 | 
| 4 |  solved | 2010-10-13 04:28:14.348753 | 

वर्गीकरण (तालिका बी)

 

| id | value |   timestamp   | 
------------------------------------------------- 
| 1 | freshman | 2006-01-01 12:02:44.888153 | 
| 2 | sophomore | 2007-01-01 12:01:19.984333 | 
| 3 |  junior | 2008-01-01 12:02:28.746149 | 

वांछित परिणाम

 
| id | resolution |   timestamp   | value | 
-------------------------------------------------------------- 
| 1 |  solved | 2006-10-05 11:55:44.888153 | freshman | 
| 2 |  closed | 2007-10-07 12:34:17.033498 | sophomore | 
| 3 | trashed | 2008-10-09 08:19:36.983747 |  junior | 
| 4 |  solved | 2010-10-13 04:28:14.348753 |  junior | 

तो, मैं जानता हूँ कि कोड निम्नलिखित की तरह लग रहे करने की जरूरत है, मैं बस को समझ नहीं सकता क्या की ON भाग के साथ क्या करना JOIN ($ 1

SELECT case.id, case.resolution, case.timestamp, class.value 
    FROM closed_cases AS case 
    LEFT JOIN classifications AS class ON ??? 
    WHERE case.timestamp BETWEEN $1 AND $2; 

मुझे लगता है मैं एक उप का चयन है, लेकिन इस पर पर काम किया जाएगा le इस्तेमाल कर सकते हैं पता है: और $ 2 चर में पारित हो जाएगा) कर रहे हैं कुछ हजार पंक्तियां, शायद अधिक, और मुझे वास्तव में तेज़ होने की आवश्यकता है; तो मैं एक साधारण खंड की उम्मीद कर रहा था जो इसे कर सकता था।

+0

मुझे लगता है कि आप अपने उप चयन की आवश्यकता होगी। क्या आपने प्रदर्शन का परीक्षण किया है और इसे अस्वीकार्य पाया है? – Beth

+0

यदि आप जिस SQL ​​का उपयोग कर रहे हैं उसका संस्करण विश्लेषणात्मक कार्यों को विंडो करने में सहायता करता है तो आप इसे उप-चयन के बिना करने में सक्षम होना चाहिए, लेकिन SQL के कुछ संस्करण उन्हें समर्थन नहीं देते हैं। कुछ हजार पंक्तियों पर एक उप-चयन के लिए, प्रदर्शन बहुत खराब नहीं होना चाहिए। (उप-चयन वर्गीकरण तालिका पर होगा - क्या इसमें वास्तव में कुछ हजार पंक्तियां होंगी?) –

+0

@ मार्क - असल में, इसके बारे में सोचने के लिए आओ, वर्गीकरण तालिका के मुकाबले कम पंक्तियां होनी चाहिए यह देखने के लिए जांचें कि डेटा वास्तव में सबसे वर्तमान संस्करण से बदल गया है या नहीं।तो मुझे लगता है कि उप-चयन सिर्फ ठीक काम करेगा, लेकिन मुझे लगता है कि अंत समय जोड़ना एक बहुत साफ समाधान है। –

उत्तर

7

यदि आप तालिका संरचनाओं में परिवर्तन कर सकते हैं, तो मैं वर्गीकरण तालिका को एक अंतिम तिथि के साथ-साथ प्रारंभ तिथि भी शामिल करने की सलाह देता हूं - इस तरह से तालिका में शामिल होना बहुत आसान होगा।

यदि नहीं, तो मेरा सुझाव है निम्नलिखित:

SELECT case.id, case.resolution, case.timestamp, class.value 
    FROM closed_cases AS case 
    LEFT JOIN (select c.*, 
        (select min(timestamp) 
        from classifications c1 
         where c1.timestamp > c.timestamp) timeend 
      from classifications c) AS class 
    ON case.timestamp >= class.timestamp and 
    (case.timestamp < class.timeend or class.timeend IS NULL) 
    WHERE case.timestamp BETWEEN $1 AND $2; 

संपादित करें - वर्गीकरण पर समाप्ति दिनांक के साथ:

SELECT case.id, case.resolution, case.timestamp, class.value 
    FROM closed_cases AS case 
    LEFT JOIN classifications AS class 
    ON case.timestamp >= class.timestamp and case.timestamp < class.timeend 
    WHERE case.timestamp BETWEEN $1 AND $2; 
+0

क्या आप संक्षेप में समझा सकते हैं कि अंतिम तिथि को शामिल करने के लिए तालिका संरचना को बदलने में मदद मिलेगी? मैं सैद्धांतिक रूप से वर्तमान अंत तारीख को भविष्य में कुछ समय तक वास्तव में दूर करके और पिछली प्रविष्टि की समाप्ति तिथि को वर्तमान प्रविष्टियों की आरंभ तिथि के रूप में अपडेट करके कर सकता हूं। –

+0

@ टोफर - अतिरिक्त क्वेरी जोड़ा गया; कोई उप-चयन की आवश्यकता नहीं है, और क्वेरी को सुलभ होना चाहिए। –

+0

+ 1/स्वीकृत - मदद मार्क के लिए धन्यवाद! जीवन को आसान बनाने के लिए मैं बस अंत समय जोड़ूंगा। –

0

टाइम स्टैंप को बदलें और तालिकाओं को जोड़ने के लिए एक कुंजी के रूप में int का उपयोग करें। इस बहुत तेजी से तारीख

तालिका 1 फ़ील्ड 1 field2 फ़ील्ड 3 की तुलना ConnectorField

table2 फ़ील्ड 1 field2 फ़ील्ड 3 ConnectorField

तो काम करेंगे और तुम सब करने की जरूरत है चयन है * तालिका 1 टी 1 आंतरिक T2.ConnectorField = T2.ConnectorField

+0

इस समाधान के लिए आवश्यक है कि ओपी मौजूदा डेटाबेस की संरचना को बदल सके, और मौजूदा मामलों के खिलाफ वर्गीकरण की तारीख सीमाओं में परिवर्तनों को रोक देगा। –

+0

इससे कोई फर्क नहीं पड़ता कि मैं एक पूर्णांक का उपयोग करता हूं या नहीं (टाइम्सस्टैम्प को पूर्णांक के रूप में संग्रहीत नहीं किया जाता है), यह अभी भी "निकटतम" की समस्या का समाधान नहीं करता है। मुझे अभी भी तालिका बी में पूर्णांक के एक पूर्णांक के आधार पर शामिल होने की आवश्यकता होगी जो तालिका ए में पूर्णांक से कम या बराबर है। –

+0

@ टोफर, शायद मुझे विनिर्देश समझ में नहीं आया। – none

-1
पर तालिका 2 टी 2 में शामिल हों
+0

यह केवल लागू वर्गीकरण की बजाय प्रत्येक मामले के लिए केस टाइमस्टैम्प के बाद सभी वर्गीकरण वापस कर देगा - इसलिए प्रदान किए गए उदाहरण के लिए, आपको 4 आवश्यकतानुसार 11 पंक्तियां लौटा दी जाएंगी। –

+0

@ मार्क मैननिस्टर - बिल्कुल। मुझे केवल 4 पंक्तियों की आवश्यकता है (मैं एक गिनती करने जा रहा हूं और उन्हें बाद में समूहित करूंगा)। –

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