2010-02-25 12 views
5

मैं ऐसा करने की कोशिश कर रहा हूं जैसे यह एक साधारण एसक्यूएल ऑपरेशन होना चाहिए, लेकिन मुझे इसे जल्दी करने के लिए सही वाक्यविन्यास नहीं मिल रहा है। मैं SQLite का उपयोग कर रहा हूँ।एसक्यूएल: कॉलम बी के मूल्य को जल्दी से प्राप्त करना जहां भी कॉलम ए न्यूनतम है

मूल समस्या यह है कि मेरे पास एक सारणी है जिसका प्राथमिक कुंजी (objUid, time) है। इसमें कॉलम objUid, समय, और फ्रेम शामिल हैं। इस सवाल के प्रयोजनों के लिए, फ्रेम एक अपारदर्शी मूल्य है।

मैं प्रत्येक objUid के लिए निकालना चाहता हूं: objUid, minTime, minTime, maxTime पर फ्रेम का मान, अधिकतम समय पर फ्रेम का मान।

... और मैं जितनी जल्दी हो सके इसे करना चाहता हूं।

मेरे पास यह अभी है, जो काम करता है, लेकिन अगर मैं "प्राकृतिक जॉइन" कथन (जिसका अर्थ है कि मुझे "फ्रेम" कॉलम नहीं मिलता है), चीजें लगभग दोगुनी होती हैं।

SELECT * FROM (
    SELECT * FROM (
     SELECT objUid, min(time) as minTime, max(time) as maxTime FROM motion GROUP BY objUid 
    ) NATURAL JOIN (
     SELECT objUid, time as minTime, frame as minFrame FROM motion 
    ) 
) NATURAL JOIN (SELECT objUid, time as maxTime, frame as maxFrame FROM motion) 

कोई विचार?

धन्यवाद!

उत्तर

2

उपयोग:

SELECT x.objuid, 
     y.time, 
     y.frame, 
     z.time, 
     z.frame 
    FROM (SELECT m.objuid, 
       MIN(m.time) AS min_time, 
       MAX(m.time) AS max_time 
      FROM MOTION m 
     GROUP BY m.objuid) x 
    JOIN MOTION y ON y.objuid = x.objuid 
       AND y.time = x.min_time 
    JOIN MOTION z ON z.objuid = x.objuid 
       AND z.time = x.max_time 
+0

आपका वाक्य रचना निश्चित रूप से मेरा (कम पागल नेस्टिंग) से बेहतर है, और यह एक ही परिणाम प्राप्त होने लगता है। ... लेकिन जब मैंने इसका परीक्षण किया तो यह कोई तेज़ नहीं था। कोई अन्य जादू आपकी आस्तीन को उठाता है? – dianders

+0

@dianders: मैं कुछ शामिल कर सकता था LIMIT, लेकिन संदेह है कि यह एक से अधिक objuid के लिए स्केलेबल होगा। –

+0

कभी भी कोई अन्य जवाब नहीं मिला, और आपका सहायक था (और मुझे दिखाया कि वास्तव में कुछ स्पष्ट नहीं था कि मैं गायब था)। अपना "सही" के रूप में चिह्नित करना। धन्यवाद! – dianders

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