प्रश्नों को करने के लिए आप "सेल्फ-जॉइन" (टेबल से खुद जुड़ना) कर सकते हैं। यहां मुश्किल हिस्सा उस क्रम को जानना है जिसमें पंक्तियों को तालिका में डाला गया था, और केवल उन पंक्तियों की तुलना करना जो क्रमिक रूप से (अस्थायी रूप से) आसन्न हैं। मुझे लगता है कि आपके पास किसी प्रकार का टाइमस्टैम्प कॉलम है जो आपको बताएगा कि पहले वाले के बाद कौन से मूल्य परिवर्तन आए थे। यदि नहीं, तो शायद "आईडी" आपको इसकी सूचना दे सकता है (कम आईडी के बाद बड़ी आईडी पंक्ति डाली जा रही है)।
अपनी तालिका 'TAB' को कॉल करना, 'ट्रेडर' का उपयोग करके शामिल होना, और ऑर्डर प्रदान करने के लिए 'ID' का उपयोग करना, क्वेरी के लिए तीन-तरफ़ा सेल्फ-जॉइन की आवश्यकता होगी जैसे कि:
SELECT a.trader
, SUM(IF(a.price > b.price, 1, 0)) nbr_incr
, SUM(IF(a.price < b.price, 1, 0)) nbr_decr
, SUM(IF(a.price = b.price, 1, 0)) nbr_same
FROM tab a
JOIN tab b
ON a.trader = b.trader AND a.id > b.id
LEFT OUTER JOIN tab c
ON a.trader = c.trader AND a.id > c.id AND b.id < c.id
WHERE c.id IS NULL
GROUP BY a.trader
उपरोक्त क्वेरी तालिका को दो बार स्वयं से जोड़ती है ताकि प्रत्येक टैब निम्नलिखित का प्रतिनिधित्व करे:
- टैब ए :तुलना के लिए नवीनतम पंक्ति
- टैब बी :तुलना करने के लिए तुरंत पहले की पंक्ति
- टैब सी :ए और बी के बीच की एक पंक्ति समय के अनुसार (अस्तित्व में नहीं होनी चाहिए)
हम 'टैब सी' में बाएं बाहरी जॉइन करते हैं क्योंकि हम वास्तव में उस पंक्ति को अस्तित्व में नहीं रखना चाहते हैं। जहां क्लॉज में, हम अपने परिणामों को केवल उन परिणामों के लिए फ़िल्टर करते हैं जहां 'टैब सी' पंक्ति मौजूद नहीं है।
अंत में, क्वेरी व्यापारी पर एक 'ग्रुप बाय' करती है, और 'ए' और 'बी' पंक्तियों से कीमत की तुलना करके एसयूएम (एस) वेतन वृद्धि और कमी करती है।
यह एक मजेदार चुनौती थी। आशा है कि यह मदद करता है!
जॉन...