SAS data step/ proc sql insert rows from another table with auto increment primary key -
मेरे पास नीचे के रूप में 2 डेटासेट हैं
id name status 1 a a 2 b b 3 सी सी एक और डाटासेट
नाम की स्थिति नई सी सी 0 डी डी 1 ई ई 1 एफ एफ 1 <पी > मैं दूसरी तालिका से 1 पंक्ति तक की सभी पंक्तियों को कैसे जोड़ूं? स्थिति यह है कि पहली तालिका स्थायी है दूसरी तालिका को मासिक अद्यतन किया जाता है, इसलिए मैं मासिक अपडेट की गई तालिका से सभी पंक्तियों को स्थायी तालिका में जोड़ना चाहूंगा, ताकि यह इस तरह दिखता आईडी नाम की स्थिति 1 ए 2 बी बी 3 सी सी 4 डी डी 5 ई ई 6 एफ एफ <पी> मुझे जो समस्या आ रही है वह है कि मैं डेटासेट से आईडी को बढ़ा नहीं सकता 1. जहां तक मैं खोजता हूं, डेटासेट में एसएएस में स्वत: वृद्धि संपत्ति नहीं है ऑटो वेतन वृद्धि डेटा चरण का उपयोग करने के साथ किया जा सकता है, लेकिन मुझे नहीं पता कि इस तरह से 2 तालिकाओं के साथ डेटा चरण का उपयोग किया जा सकता है। सामान्य एसक्यूएल होगा तालिका 1 में डालें (नाम, स्थिति) नाम का चयन करें, तालिका 2 से स्थिति जहां नया = 1; लेकिन चूंकि एसएएस डेटासेट स्वत: वृद्धि कॉलम का समर्थन नहीं करता है इसलिए इस समस्या का सामना करना पड़ रहा है I मैं इसे एसएएस डेटा चरण का उपयोग करके निम्न प्रोप एसक्यूएल
डेटा टेबल 1 के बाद कर सकता हूं; तालिका 1 सेट करें; अगर _n_ & gt; 3 तब आईडी = _n_; चलाने; यह आईडी कॉलम के मान में वृद्धि करेगा, लेकिन कोड थोड़े बदसूरत है, और आईडी प्राथमिक कुंजी है, और अन्य तालिका में एक विदेशी कुंजी के रूप में इस्तेमाल किया जा रहा है, इसलिए मैं पुरानी पंक्तियों के आईएसएस को गड़बड़ाना नहीं चाहते हैं।
मैं दोनों सीखने और एसएएस के साथ काम करने की प्रक्रिया में हूँ इसलिए मदद की वास्तव में सराहना की जाती है। अग्रिम धन्यवाद।
अतिरिक्त प्रश्न: यदि दूसरी तालिका में नया कॉलम नहीं है, तो मैं जो कुछ चाहता हूं, उसे पूरा करने का कोई तरीका है (मासिक तालिका (दूसरी) से स्थायी तालिका (1) ) डेटा चरण के साथ? वर्तमान में, मैं इस बदसूरत proc sql / डेटा चरण का उपयोग नया स्तंभ बनाने के लिए
proc sql; // तालिका 2 से एक टेम्प्क तालिका बनाइए t2temp चुनें टी 2 के रूप में। *, (जब टी 2.name = t1.name और t2.status = t1.status तब 0 और 1) तालिका 2 से नए के रूप में टी 2 बाएं तालिका 1 में शामिल होने के रूप में t1 पर t2.name = t1.name और t2.status = t1.status; ड्रॉप तालिका टी 2; // कोई नया कॉलम "नया" छोड़ने के साथ पुराने तालिका 2 ड्रॉप करें; डेटा तालिका 2; // t2temp का नाम बदलें तालिका 2 सेट t2temp; चलाने;
आप इसे डेटास्टेप में कर सकते हैं। बीटीडब्ल्यू, यदि आप इसे पूरी तरह नवीनीकरण कर रहे थे, तो आप केवल
id + 1 का उपयोग कर सकते हैं; एक स्वायत्त क्षेत्र बनाने के लिए (अपना डेटा कदम संभालने में बहुत जटिल नहीं था)। यह वर्तमान उच्चतम आईडी नंबर का ट्रैक रखेगा और प्रत्येक पंक्ति में एक उच्च स्थान रखता है जैसे कि आप नए डेटासेट में हैं।
डेटा है; इनपुट आईडी नाम $ स्थिति $; datalines; 2 ए एक 3 बी बी 1 सी सी ;;;; चलाने; डेटा एडन; इनपुट नाम $ स्थिति $ नया; datalines; सी सी 0 डी डी 1 ई ई 1 एफ एफ 1 ;;;; चलाने; डेटा चाहते हैं; _maxID; * _maxID के मूल्य को एक पंक्ति से अगले पर रखें, इसे रीसेट न करें; सेट (में = पुराने) addon (में = जोड़); * में = एक अस्थायी चर इंगित करता है जो डेटासेट एक पंक्ति से आया; अगर (पुराने) या (जोड़ और नया); * एसएएस में जैसे सी / आदि, 0 / लापता (शून्य) गलत नकारात्मक / सकारात्मक संख्या सही है; यदि जोड़ें तो आईडी = _maxID + 1; * नए अभिलेखों को आईडी प्रदान करता है; _maxID = max (id, _maxID); * नई अधिकतम आईडी निर्धारित करता है - यह संरचना यह काम करता है, भले ही पुराने डीएस को सॉर्ट नहीं किया गया हो; आईडी = नाम =; ड्रॉप _मैक्सआईडी; चलाने; दूसरे प्रश्न का उत्तर:
हां, आप अभी भी ऐसा कर सकते हैं। आसान तरीकों में से एक है, अगर आपके पास डेटासेट सॉर्ट किया गया है:
डेटा चाहता है; _maxID; सेट (में = पुराने) addon (में = जोड़); नाम से; अगर (पुराने) या (जोड़ें और पहले। नाम); यदि जोड़ें तो आईडी = _maxID + 1; _maxID = max (id, _maxID); आईडी = नाम =; चलाने; प्रथम। नाम नाम के समान मूल्य के साथ पहले रिकॉर्ड के लिए सही होगा; इसलिए यदि उस नाम का मान है, तो ADDON को एक नया रिकॉर्ड जोड़ने की अनुमति नहीं दी जाएगी। इसके लिए नाम को अद्वितीय होना चाहिए, या आप हटाना चाहते हैं कुछ रिकॉर्ड अगर यह सच नहीं है तो आपके पास एक और जटिल समाधान है।
Comments
Post a Comment