यह मेरा पसंदीदा MySQL हैक है।
आप लैग फ़ंक्शन का अनुकरण इस प्रकार करते हैं:
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
from stocks order by company,time;
lag_quote
पिछली पंक्ति के उद्धरण का मान रखता है। पहली पंक्ति के लिए @quot -1 है।curr_quote
वर्तमान पंक्ति के उद्धरण का मान रखता है।
नोट:
order by
क्लॉज यहां महत्वपूर्ण है जैसे यह एक नियमित विंडो फ़ंक्शन में है।- आप
company
. के लिए भी अंतराल का उपयोग करना चाह सकते हैं बस यह सुनिश्चित करने के लिए कि आप एक हीcompany
. के उद्धरणों में अंतर की गणना कर रहे हैं । - आप उसी तरह पंक्ति काउंटर भी लागू कर सकते हैं
@cnt:[email protected]+1
इस योजना के बारे में अच्छी बात यह है कि कुछ अन्य दृष्टिकोणों की तुलना में कम्प्यूटेशनल रूप से बहुत दुबला है, जैसे कि एप्लिकेशन सर्वर में समग्र कार्यों, संग्रहीत प्रक्रियाओं या डेटा को संसाधित करना।
संपादित करें:
अब आपके द्वारा बताए गए प्रारूप में परिणाम प्राप्त करने के आपके प्रश्न पर आते हैं:
SET @quot=0,@latest=0,company='';
select B.* from (
select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp:=A.company as company from (
select time,company,[email protected] as change, @quot:=quote curr_quote
from stocks order by company,time) A
order by company,time desc) B where B.LATEST=1;
घोंसला सह-संबंधित नहीं है इसलिए उतना बुरा नहीं है (कम्प्यूटेशनल रूप से) जितना दिखता है (वाक्य रचनात्मक रूप से) :)
अगर आपको इसमें कोई मदद चाहिए तो मुझे बताएं।