मैं एक उत्पादन घंटे डेटासेट में एक कॉलम जोड़ने की कोशिश कर रहा हूं जो बताएगा कि पिछले हफ्ते काम करने वाला प्रदाता भी तीन हफ्ते पहले काम कर रहा था या नहीं। वर्तमान डेटासेट कुछ इस तरह दिखता है:

RowID | ProviderID | ClientID |     DOS    |   DOS (Week)  | Hours 
  1   | 1111111111 | 22222222 | 11/2/2020  |   11/1/2020   | 2.5 
  2   | 1111111111 | 33333333 | 11/5/2020  |   11/1/2020   | 1 
  3   | 1111111111 | 44444444 | 10/13/2020 |   10/11/2020  | 3 

मैं मूल्यों के लिए y/n या 1/0 के साथ एक अतिरिक्त कॉलम 'सक्रिय 3 सप्ताह पहले' प्राप्त करने का प्रयास कर रहा हूं। उपरोक्त तालिका के लिए, मान लें कि प्रदाता 10/13/20 को शुरू हुआ था। नया कॉलम आदर्श रूप से इस तरह आबाद होगा:

RowID | ProviderID | ClientID |     DOS    |   DOS (Week)  | Hours | Active 3 weeks Prior 
  1   | 1111111111 | 22222222 | 11/2/2020  |   11/1/2020   | 2.5   |   Yes              
  2   | 1111111111 | 33333333 | 11/5/2020  |   11/1/2020   | 1     |   Yes
  3   | 1111111111 | 44444444 | 10/13/2020 |   10/11/2020  | 3     |   No

कुछ अतिरिक्त बातें: हमारा संगठन रविवार को सप्ताह की शुरुआत के रूप में उपयोग करता है इसलिए डॉस (सप्ताह) सेवा की तारीख से पहले का रविवार है। जो मैं अब तक पढ़ रहा हूं, ऐसा लगता है कि यहां समाधान किसी प्रकार का स्वयं शामिल है, जहां आधार उत्पादन रिकॉर्ड साप्ताहिक घंटों में एकत्रित होते हैं और उसी प्रदाता आईडी के डॉस (सप्ताह) -21 के रिकॉर्ड के साथ तुलना की जाती है।

मुझे जो परेशानी हो रही है वह यह है: क्या मैं स्वयं-जुड़ने के साथ पहले स्थान पर सही रास्ते पर हूं और मिलान मूल्य खोजने में सफलता या विफलता के आधार पर मैं y/n मान कैसे उत्पन्न करूंगा। साथ ही, मुझे संदेह है कि प्रदाता आईडी और डॉस (सप्ताह) के संयोजन के आधार पर शामिल होना त्रुटिपूर्ण हो सकता है? मैं अब तक यही खेल रहा हूं।

कृपया मुझे बताएं कि क्या मैं प्रश्न को बिल्कुल स्पष्ट कर सकता हूं या कुछ बहुत स्पष्ट याद कर रहा हूं। मैं वास्तव में किसी भी मदद की सराहना करता हूं, क्योंकि मैं कुछ दिनों से उत्तर पर कोई सुराग पाने के लिए सही खोज शब्दों का पता लगाने की कोशिश कर रहा हूं।

-1
nkamlearn 13 नवम्बर 2020, 00:39

1 उत्तर

सबसे बढ़िया उत्तर

यदि आप MySQL 8.0 चला रहे हैं, तो आप विंडो फ़ंक्शन और range विनिर्देश का उपयोग कर सकते हैं:

select t.*,
    (
        max(providerid) over(
            partition by providerid 
            order by dos
            range between interval 3 week preceding and interval 3 week preceding
        ) is not null
    ) as active_3_weeks_before
from mytable t

आपके स्पष्टीकरण और डेटा से यह वास्तव में स्पष्ट नहीं है कि तीन सप्ताह पहले भी काम कर रहा था से आपका क्या मतलब है। क्वेरी क्या करती है, प्रत्येक पंक्ति के लिए, यह जांचने के लिए कि क्या एक ही आपूर्तिकर्ता के साथ एक और पंक्ति मौजूद है और एक dos जो वर्तमान पंक्ति के dos से ठीक 3 सप्ताह पहले है। इसे किसी अन्य आवश्यकता के लिए आसानी से अनुकूलित किया जा सकता है।


संपादित करें: यदि आप पिछले ३ सप्ताह के भीतर किसी भी रिकॉर्ड की जांच करना चाहते हैं, तो आप विंडो श्रेणी को इसमें बदल सकते हैं:

range between interval 3 week preceding and interval 1 day preceding

और यदि आप इसे MySQL <8.0 में चाहते हैं, जहां विंडो फ़ंक्शन उपलब्ध नहीं हैं, तो आप एक सहसंबद्ध सबक्वेरी का उपयोग करेंगे:

select t.*,
    exists (
        select 1
        from mytable t1
        where 
            t1.providerid = t.provider_id
            and t1.dos >= t.dos - interval 3 week
            and t1.dos <  t.dos
    ) as active_3_weeks_before
from mytable t
0
GMB 12 नवम्बर 2020, 22:35