2012-06-18 13 views
5

मेरे पास एक सारणी है जिसमें नाम, घटनाएं और तिथियां हैं। मैंने एक नया क्षेत्र 'evt5_date' बनाया है जो एक विशिष्ट घटना से संबंधित है (evt5)।मैं 'से अधिक' और 'समूह द्वारा' का उपयोग करके शामिल कैसे हो सकता हूं?

प्रत्येक नाम में कई घटनाएं हो सकती हैं जिनमें से प्रत्येक का समय evt_date फ़ील्ड में दर्ज किया जाता है। दो घटनाएं evt1 और evt2evt5 से संबंधित हैं।

मैं सभी evt1 और evt2 पंक्तियों evt5 पूर्ववर्ती में एक evt5 की पहली आवृत्ति की तारीख सम्मिलित करना चाहते हैं। evt1 या evt2 के बाद evt5 नहीं है तो फ़ील्ड खाली छोड़ दिया गया है।

यह सब प्रत्येक name के लिए किया जाना चाहिए। कुछ हज़ार अलग-अलग नाम हैं। evt5_date

name  evt_date  event evt5_date 
name-1 2010-06-30  evt1  
name-1 2009-10-30  evt5 
name-1 2009-09-30  evt2  
name-1 2009-06-30  evt5   
name-1 2009-03-30  evt5  
name-1 2009-02-28  evt2  
name-1 2009-01-30  evt1  
name-2 2005-05-30  evt2 
name-2 2005-03-30  evt5 
name-2 2005-01-30  evt1  

के मानों मैं इसे देखने के लिए कैसे करना चाहते हैं - - मैं सिर्फ नीचे

वर्तमान तालिका डेटा डेटा में 2 दिखाने गए evt5_date क्षेत्र में मूल्यों

name  evt_date  event evt5_date 
name-1 2010-06-30  evt1  
name-1 2009-10-30  evt5 
name-1 2009-09-30  evt2  2009-10-30 
name-1 2009-06-30  evt5   
name-1 2009-03-30  evt5  
name-1 2009-02-28  evt2  2009-03-30 
name-1 2009-01-30  evt1  2009-03-30 
name-2 2005-05-30  evt2 
name-2 2005-03-30  evt5 
name-2 2005-01-30  evt1  2005-03-31 

मैंने नीचे दिए गए कोड के साथ अद्यतन करने का प्रयास किया, लेकिन मुझे नहीं पता था कि evt5 की तारीख के बीच संबंध को निर्दिष्ट करने के लिए evt1 और evt2 के evt_date से अधिक होने के दौरान कैसे निर्दिष्ट करना है जबकि समूह सबसे हालिया evt5 से संबंधित evt_date प्राप्त करने के लिए evt5 द्वारा जी।

मुझे नाम से समूह करने की भी आवश्यकता है क्योंकि ईवेंट प्रत्येक नाम के लिए विशिष्ट हैं।

update mytable as t1 
set t1.evt5_date = (select min(t2.evt_date) from mytable as t2 
        where t2.event = 'evt5' AND 
          t2.evt_date > t1.evt_date 
        group by name) 
where 
    t1.event in ('evt1', 'evt2') 

किसी भी सुझाव की सराहना की जाएगी। धन्यवाद

अपडेट अंतिम समाधान - कुछ मामूली परिवर्तन name

UPDATE mytable AS t1 
INNER JOIN 
    (
     SELECT 
      a.name, a.evt_date, 
     MIN(b.evt_date) AS nearest_date 
     FROM  mytable AS a 
     INNER JOIN mytable AS b ON b.event = 'evt5' 
          AND b.evt_date > a.evt_date 
          AND a.name = b.name  -- needed this additional condition 
     GROUP BY a.name, a.evt_date      -- added 'a.name' to 'group by' 
    ) AS nearest_dates 
     ON nearest_dates.evt_date = t1.evt_date AND 
     nearest_dates.name = t1.name     -- added this additional condition 
SET t1.evt5_date = nearest_dates.nearest_date 
WHERE t1.event IN ('evt1', 'evt2'); 
+0

जो a2.evt5_date ??? है, मैं समझ गया नहीं है, आप अद्यतन T1 है और a2 सेट ? – jcho360

+0

@ jcho360 - खेद है कि एक टाइपो था, यह 'टी 1' होना चाहिए। अब तय –

+0

क्या आप कुछ संरचना और डेटा sqlfiddle में डाल सकते हैं और इसे साझा कर सकते हैं? – jcho360

उत्तर

4

मैं अपने अद्यतन बयान तय की अखंडता बनाए रखने @biziclop द्वारा प्रदान की जवाब देने के लिए, मैं इसे अब काम करता है लगता है। मैंने GROUP BY name भाग छोड़ा, क्योंकि यह आपके संस्करण में सार्थक नहीं था।

UPDATE mytable AS t1 
INNER JOIN 
    (
     SELECT 
     a.evt_date, 
     MIN(b.evt_date) AS nearest_date 
     FROM  mytable AS a 
     INNER JOIN mytable AS b ON b.event = 'evt5' 
          AND b.evt_date > a.evt_date 
     GROUP BY a.evt_date 
    ) AS nearest_dates ON nearest_dates.evt_date = t1.evt_date 
SET t1.evt5_date = nearest_dates.nearest_date 
WHERE t1.event IN ('evt1', 'evt2'); 

पहले कुछ सत्यापन: http://sqlfiddle.com/#!2/309ac/6

अंतिम UPDATE क्वेरी: http://sqlfiddle.com/#!2/80c3c/1

+0

इस के लिए और sqlfiddle पर महान स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। मैंने अलग-अलग नामों के लिए कुछ मामूली परिवर्तन किए हैं (जैसा कि अद्यतन प्रश्न में दिखाया गया है)। मैं वास्तव में सहायता के लिए आभारी हूं। –

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

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