2013-08-09 4 views
5

मेरे प्रोग्राम के भीतर, मैं आने वाले डेटा का ऑडिट करता हूं, जो कि 4 प्रकार का हो सकता है। यदि डेटा सभी आवश्यक मानदंडों को पूरा करता है, तो तालिका तालिका में पंक्ति दर्ज होने के बाद संदेश प्रकार और टाइमस्टैम्प के साथ तालिका तालिका में सफलता के साथ संग्रहीत किया जाता है।एसक्यूएल - मैक्स के साथ डेटा के लिए अलग पंक्ति लौटने वाला टाइमस्टैम्प मान

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

एक तीसरा संदेश, अस्वीकार होता है और रिकॉर्डिंग लिखा जाता है यदि आने वाला डेटा आवश्यक मानक को पूरा नहीं करता है, फिर से एक टाइमस्टैम्प के साथ।

मैं क्या करना चाहता हूं, उच्चतम टाइमस्टैम्प के साथ प्रत्येक प्राप्त संदेश के लिए केवल रिकॉर्ड को वापस खींचने के लिए एक Sybase SQL क्वेरी लिखना है।

तो उपर्युक्त त्रुटि उदाहरण के साथ, मैं त्रुटि रिकॉर्ड वापस नहीं करना चाहता, केवल प्रक्रिया के पुन: प्रयास किए जाने से ही सफलतापूर्वक रिकॉर्ड रिकॉर्ड और सफलता थी।

मैं .. निम्नलिखित की तरह कुछ के बारे में सोचा था

SELECT distinct(*) 
    FROM auditingTable 
     WHERE timestamp = (SELECT MAX(timestamp) from auditingTable) 

हालांकि मैं बारे में पता यह केवल वापस 1 रिकॉर्ड लाना होगा, पूरे तालिका में सबसे ज्यादा टाइमस्टैम्प के साथ।

मैं अपनी स्थिति के बावजूद प्राप्त प्रत्येक संदेश के लिए सबसे हालिया रिकॉर्ड कैसे प्राप्त कर सकता हूं ??

कोई भी विचार आपका स्वागत है!

उत्तर

4

मैं ध्यान दें कि आपकी क्वेरी के लिए एक सरल संशोधन आप आप क्या चाहते हैं करने की अनुमति देता चाहते हैं (हालांकि मैं वैलेक्स के उत्तर में row_number() विधि पसंद करता हूं)। यही कारण है कि एक सहसंबद्ध सबक्वेरी को where खंड में सबक्वेरी चालू करने के लिए है:

SELECT * 
FROM auditingTable at1 
WHERE timestamp = (SELECT MAX(timestamp) 
        from auditingTable at2 
        where at1.MessageId = at2.MessageId 
       ); 

यह मानक एसक्यूएल और Sybase के किसी भी संस्करण में काम करना चाहिए।

0

मैं रिकॉर्ड्स की पहचान आसानी से करने के लिए auditingTable पर स्वत: वृद्धि प्राथमिक प्राथमिक फ़ील्ड जोड़ने की अनुशंसा करता हूं। निम्न क्वेरी के लिए मुझे लगता है कि आपने यह कॉलम जोड़ा है और इसे auditRecordId नाम दिया है।

यह मानते हुए कि आप फिर निम्न काम करना चाहिए messageType द्वारा प्रत्येक संदेश की पहचान कर रहे:

SELECT  A1.messageType, 
      A1.message 
FROM  auditingTable A1 
INNER JOIN (
       SELECT  MAX(auditRecordId) auditRecordId, 
          messageType 
       FROM  auditingTable 
       GROUP BY messageType 
      ) A2 ON A1.auditRecordId = A2.auditRecordId 
5

आप अपने Sybase संस्करण का उल्लेख नहीं किया है। आप उपयोग कर सकते हैं ROW_NUMBER() function

उदाहरण के लिए अपनी मेज MessageId, MessageTime क्षेत्रों ने आपको निम्न क्वेरी का उपयोग कर सकते हैं:

SELECT * FROM 
(
    SELECT auditingTable.*, 
    ROW_NUMBER() OVER (PARTITION BY MessageID ORDER BY MessageTime DESC) as RN 
    FROM auditingTable 
) as T 
WHERE RN=1; 
संबंधित मुद्दे