2016-09-21 5 views
5

मैं एक पारंपरिक एसक्यूएल शैली चलाना चाहते हैं KDB +/प्रमैं केडीबी में एक कुशल बाएं शामिल कैसे करूं?

  • में शामिल होने के हम छोड़ दिया तालिका में प्रत्येक पंक्ति के लिए परिणाम में कम से कम एक पंक्ति पाने के लिए छोड़ दिया।
  • अगर कोई सही तालिका में एक से अधिक मैच है, मैं एक पंक्ति के लिए उन में से प्रत्येक के बस नहीं पहले मैच

टेस्ट डाटा

x:([];a:1 1 2 3; b:3 4 5 6) 

    y:([]; a:1 2 2 4; c:7 8 9 10) 
सबसे अच्छा

के लिए मिलता है, संस्करण मैं इस तरह के बारे में सोच सकता हूं:

यह एक बाएं जुड़ने को जोड़ता है जो आंतरिक मिलान में पहला मैच प्रदान करता है जो सभी मैचों को प्रदान करता है और फिर डुप्लिकेट को हटा देता है:

distinct ej[`a; x; y] , x lj `a xkey y 

किसी को भी एक तेजी से और/या कुछ अन्य तरीके से बेहतर है कि मुझे अपने साथ की आपूर्ति कर सकते हैं? उदाहरण के लिए, मैं वास्तव में अलग-अलग उपयोग से बचना चाहता हूं।

उत्तर

0

@ रयान के जवाब पर बिल्डिंग।

k)nungroup:{$[#x:0!x;(,/){$[#t:+:x;t;enlist *:'[x];t]}'[x]]} 
q)nungroup:{$[count x:0!x;(,/){$[count t:flip x;t;enlist first'[x]]}'[x];x]} 

q)nungroup x lj ` \`a xgroup y 

a b c 
----- 
1 3 7 
1 4 7 
2 5 8 
2 5 9 
3 6 
+0

वाह, धन्यवाद! कॉनर, मैं अभी तक k पढ़ने नहीं है। ** क्या आप समझा सकते हैं कि आपने क्या किया? ** फिर से धन्यवाद! – JSLover

+0

यह क्यू कार्यान्वयन है। 'क्यू) नंग समूह: {$ [गिनती x: 0!एक्स;,/[प्रत्येक एक्स फ्लिप], पहले प्रत्येक,/[x]; x]} ' –

+0

@ कॉनर गर्विन: आपका समाधान उदा। 'एक्स: ([] ए: 1 1 2 3 4; बी: 3 4 5 6 100)' –

1
q)`a xgroup y // group the lookup table by keys 
a| c 
-| --- 
1| ,7 
2| 8 9 
4| ,10 
q)x lj `a xgroup y // join all combinations 
a b c 
------------ 
1 3 ,7 
1 4 ,7 
2 5 8 9 
3 6 `long$() 
q)ungroup x lj `a xgroup y // unroll using ungroup to produce a flat table 
a b c 
----- 
1 3 7 
1 4 7 
2 5 8 
2 5 9 

हम KDB पर एक नि: शुल्क ट्यूटोरियल मिलती है कि यहां उन सभी को दर्शाता है प्रदान करते हैं: http://www.timestored.com/kdb-guides/qsql-inner-left-joins

जब से हम हर @Connors समाधान

अच्छा समाधान कॉनर पर row..based चाहते हैं। मैं संशोधित तुम्हारा छोटा/कोड को आसान बनाने:

q)bungroup:{ungroup {$[0=count x;(),first x; x]}''[x]} 
q)bungroup x lj `a xgroup y 
a b c 
-------- 
1 3 7 
1 4 7 
2 5 8 
2 5 9 
3 6 
4 100 10 

FYI करें: कोनर्स तेज है और इस विशेष मामले के लिए कम स्मृति का उपयोग करता है।

+0

क्या यह पहली आवश्यकता को पूरा करता है (हमें बाएं तालिका में प्रत्येक पंक्ति के परिणामस्वरूप कम से कम एक पंक्ति मिलती है)? मुझे लगता है कि ओपी चाहता है कि यह परिणाम 3 3 0 एन' शामिल हो। –

+2

मदद के लिए धन्यवाद! ठीक है, हम बाईं तालिका में प्रत्येक पंक्ति के लिए परिणाम में कम से कम एक पंक्ति की जरूरत है। असमूहीकृत/xgroup चाल हमेशा में एक आंतरिक में शामिल होने के परिणाम, तब भी जब एक KDB "LJ" आपरेशन किया जाता है। ऐसा इसलिए है क्योंकि समूहबद्ध तालिका में बाईं ओर उत्पादित नल पंक्तियों में बेजोड़ तालिका से कॉलम के लिए शून्य लंबाई सूचियां होती हैं। जब ये असंगठित होते हैं, तो वे शून्य पंक्तियों वाली एक पंक्ति के बजाय शून्य पंक्तियां उत्पन्न करते हैं। यह फ़ायदेमंद होगा कि रिक्त entires के साथ एक ही पंक्ति का उत्पादन जब सूची महत्वपूर्ण स्तंभों शून्य लंबाई के होते हैं असमूहीकृत का एक संस्करण के लिए? टीएक्स! – JSLover

+0

तो, अब मैं अपने स्वयं कर कुछ मुझे विश्वास है कि शायद वास्तव में बुरा रूप है पाते हैं। मैं तारों का उपयोग करने से परहेज कर रहा हूँ। मैं ऐसा इसलिए कर रहा हूं क्योंकि स्ट्रिंग्स, जैसा कि मैं उनका उपयोग कर रहा हूं, यहां प्रस्तावित दृष्टिकोण तोड़ दो। उदाहरण के लिए, एक स्ट्रिंग कॉलम के साथ x के नए मान के साथ फिर से समाधान चलाएं, यह समाधान विफल हो जाता है। एक्स: ([]; ए: 1 1 2 3; बी: 3 4 5 6; जेड: ("फू"; "बार"; "बाज़"; "बैंग")) – JSLover

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