يمثل نظام التحليل الإحصائي، المعروف اختصاراً باسم نظام SAS البرمجي، ركيزة بنيوية راسخة في فضاء معالجة البيانات المعقدة والتحليلات المتقدمة عبر مختلف القطاعات الحيوية، بدءاً من الأبحاث الوبائية والتجارب السريرية وصولاً إلى النمذجة المالية وإدارة المخاطر المصرفية. تنبع قوة هذه المنظومة من قدرتها الاستثنائية على إدارة مجموعات البيانات الضخمة التي تتجاوز سعة الذاكرة العشوائية التقليدية، وذلك بالاعتماد على محركات معالجة منضبطة تخضع لمعايير صارمة في التحقق والتدقيق. وفي خضم هذه البيئة الحسابية الدقيقة، تكتسب عمليات استخلاص البيانات وتنقيتها أهمية محورية؛ إذ إن صحة أي استدلال إحصائي أو نموذج تنبؤي ترتبط ارتباطاً وثيقاً بمدى نقاء العينة المدخلة وخلوها من الشوائب أو الملاحظات الخارجة عن نطاق الدراسة المعتمدة.
تعتبر التصفية الشرطية حجر الزاوية في هندسة البيانات داخل SAS، حيث تتطلب السيناريوهات التحليلية في كثير من الأحيان استبعاد فئات محددة من السجلات بناءً على معايير محددة سلفاً. وهنا يبرز معامل الاستبعاد الجماعي NOT IN بوصفه إحدى أكثر الأدوات المنطقية فاعلية وأناقة برمجية. يتيح هذا المعامل لمحللي البيانات صياغة شروط نفي مركبة تختزل أسطراً متعددة من الأكواد التقليدية في تعبير منطقي واحد عالي الكفاءة، مما يسهم في تقليل احتمالات الخطأ البشري ورفع قابلية قراءة الشيفرة البرمجية وصيانتها على المدى الطويل في البيئات الإنتاجية المشتركة.
يتناول هذا الدليل الشامل والمفصل دراسة متعمقة لكيفية توظيف معامل NOT IN في بيئة SAS بمختلف مستوياتها؛ حيث نستعرض الأبعاد النظرية للمنطق البولياني الموجه نحو الاستبعاد، ونتتبع سلوك المعامل داخل خطوة البيانات التقليدية واستعلامات لغة الاستعلامات البنيوية المدمجة. كما نغوص في التفاصيل الدقيقة لمعالجة المتغيرات النصية والعددية، مع التركيز على المعضلات الحسابية الشائعة مثل حساسية حالة الأحرف، والدقة التمثيلية للنقاط العائمة، وإشكالية القيم المفقودة التي قد تؤدي إلى تشويه نتائج التصفية إذا لم تُعالج بمنهجية رياضية منضبطة ومحكمة.
- 1. مقدمة عامة حول لغة SAS وأهمية تصفية البيانات الإحصائية
- 2. البنية النحوية الأساسية لمعامل “NOT IN” في بيئة SAS
- 3. تطبيق معامل “NOT IN” ضمن خطوة البيانات (DATA Step)
- 4. استخدام معامل “NOT IN” في استعلامات إجراء SQL (PROC SQL)
- 5. التعامل مع المتغيرات النصية (Character Variables) باستخدام NOT IN
- 6. التعامل مع المتغيرات العددية (Numeric Variables) وتفادي أخطاء التحويل
- 7. معضلة القيم المفقودة (Missing Values) وتأثيرها على منطق الاستبعاد
- 8. المقارنة المعيارية: معامل “NOT IN” مقابل البدائل المنطقية المتعددة
- 9. تطبيقات ودراسات حالة عملية باستخدام بيانات واقعية
- 10. الأخطاء الشائعة واستكشاف المشكلات وإصلاحها (Troubleshooting)
- 11. أفضل الممارسات البرمجية والتقنيات المتقدمة لتوسيع الكود
- 12. الخلاصة الإرشادية والتوجيهات المستقبلية لمحللي البيانات
- المراجع
1. مقدمة عامة حول لغة SAS وأهمية تصفية البيانات الإحصائية
1.1 مكانة نظام التحليل الإحصائي (SAS) في معالجة البيانات الضخمة
شهدت منظومة التحليل الإحصائي SAS منذ نشأتها في سبعينيات القرن العشرين تطوراً متواصلاً جعلها المعيار الذهبي المعتمد لدى المؤسسات الأكاديمية والهيئات التنظيمية الدولية، مثل إدارة الغذاء والدواء الأمريكية والمصارف المركزية العالمية. ترتكز هذه المكانة الرفيعة على التزام النظام بمبادئ الحوسبة الموثوقة، والقدرة الفائقة على معالجة ملايين السجلات بكفاءة استثنائية عبر استراتيجيات القراءة التتابعية واستغلال مساحات التخزين المؤقتة على الأقراص الصلبة، مما يتيح تجاوز قيود الذاكرة الفيزيائية التي تعاني منها بيئات برمجية أخرى.
يتطلب التعامل مع البيانات الضخمة تحكماً صارماً في تدفق السجلات وتحديد المجموعات الفرعية المستهدفة بدقة متناهية؛ فالتحليلات المتقدمة لا تُجرى دائماً على كامل البيانات الخام، بل تستوجب في معظم مراحلها اقتطاع عينات موجهة تستبعد الملاحظات المشوهة، أو السجلات المكررة، أو الفئات التي لا تقع ضمن النطاق التجريبي للدراسة. يساعد هذا الاقتطاع الدقيق على توفير الموارد الحوسبية وتقليص زمن التنفيذ بصورة ملحوظة.
تؤدي قواعد التصفية المنطقية دوراً جوهرياً في حماية سلامة المخرجات الإحصائية من الانحياز المنهجي. فإذا ما أُجريت التصفية بناءً على معايير غير منضبطة أو باستخدام معاملات منطقية يساء فهم سلوكها الداخلي، فإن ذلك قد يؤدي إلى استبعاد غير مقصود لحالات سليمة، أو الاحتفاظ بملاحظات تؤثر سلباً على التقديرات المعلمية، وتؤدي إلى تشويه التوزيع الاحتمالي للمتغيرات، مما يفقد التحليل النهائي مصداقيته العلمية والتطبيقية.
1.2 مفهوم المعاملات المنطقية (Logical Operators) في برمجة SAS
تعتمد برمجة SAS على بنية منطقية مزدوجة تتكامل فيها المعاملات المقارِنة النسبية مع المعاملات المنطقية التجميعية لتشكيل الشروط البرمجية المعقدة. تختص المعاملات النسبية، مثل علامات التساوي والتفاوت والتباين الرياضي، بمقارنة قيم المتغيرات الفردية، في حين تعمل المعاملات المنطقية مثل AND وOR وNOT على دمج هذه المقارنات وبناء منظومة متكاملة لتقييم العبارات الشرطية وفق المنطق البولياني الصارم القائم على ثنائية الصواب والخطأ.
يقوم محرك التنفيذ في SAS بتقييم هذه الشروط التجميعية بصورة تسلسلية محددة داخلياً؛ حيث تمثل القيمة واحد منطقياً حالة الصواب (True)، بينما تمثل القيمة صفر حالة الخطأ (False). يتأثر مسار التقييم بالأسبقية الرياضية المقررة للمعاملات، وهو ما يفرض على المبرمج إدراك الكيفية التي يتفاعل بها المعالج مع العبارات المركبة لضمان أن التعبير المنطقي يعكس الفرضية البحثية بدقة تامة دون تداخل غير مقصود بين العمليات الحسابية والمنطقية.
يلعب الترتيب المنطقي للشروط البرمجية دوراً محورياً في تحسين زمن المعالجة وتقليل استهلاك موارد المعالج والذاكرة. فعند بناء شروط التصفية بطريقة تتيح للمترجم استبعاد السجلات غير المؤهلة في المراحل المبكرة من التقييم، يُختصر مسار الفحص المنطقي للسجل، وهو ما ينعكس بصورة إيجابية واسعة على أداء المنظومة الحسابية بأكملها عند معالجة الجداول الضخمة التي تحتوي على عشرات الملايين من القيود.
1.3 نظرة عامة موجزة على المعامل المنطقي “NOT IN”
يُعرف معامل NOT IN وظيفياً في بيئة SAS بأنه معامل استبعاد جماعي متخصص، صُمم خصيصاً لاختبار مدى خلو قائمة محددة مسبقاً من قيمة متغير معين. يتيح هذا المعامل لمحلل البيانات تقييم شرط النفي عبر مقارنة القيمة المفحوصة بمجموعة من الثوابت النصية أو الرقمية في خطوة منطقية موحدة، متجاوزاً الحاجة إلى تكرار معاملات التباين المنفردة.
يتجلى الفارق الجوهري بين الاستبعاد الفردي والاستبعاد المتعدد عند مقارنة الأسلوب التقليدي الذي يتطلب كتابة سلاسل طويلة من عبارات عدم التساوي المقترنة بمعامل العطف المنطقي، بالأسلوب الذي يوفره معامل NOT IN. فالأول يتطلب صياغة كود مطول قد يؤدي أي سهو فيه إلى خلل منطقي جسيم، في حين يقدم الثاني صياغة مركزة تحصر عناصر الاستبعاد ضمن أقواس واضحة، مما يعزز مناعة الشيفرة البرمجية ضد الأخطاء البشرية العرضية.
يسهم اعتماد معامل NOT IN في تقليل التعقيد الحسابي والبرمجي على حد سواء؛ حيث يسهل قراءة النص البرمجي ومراجعته من قِبل المدققين الخارجيين، إضافة إلى تمكين محركات الفهرسة والتحسين داخل نظام SAS من تفسير قصد المبرمج بصورة مباشرة، وهو ما ينعكس في كثير من الأحيان على تسريع خطط التنفيذ البرمجية وتسهيل صيانتها وتحديث معاييرها مستقبلاً.
2. البنية النحوية الأساسية لمعامل “NOT IN” في بيئة SAS
2.1 الصياغة البرمجية القياسية لقاعدة الاستبعاد
تخضع البنية النحوية لمعامل NOT IN في بيئة SAS لقواعد صياغة واضحة تحدد مواقع العناصر البرمجية بدقة تامة لضمان المعالجة السليمة. تبدأ الصياغة بذكر اسم المتغير المستهدف بالتقييم، يليه مباشرة المعامل المنطقي، ثم تُفتح أقواس هلالية تحصر بداخلها كافة القيم المطلوب استبعادها من نطاق المعالجة أو التحليل، كما هو موضح في البنية العامة التالية:
Variable_Name NOT IN (Value_1, Value_2, …, Value_N);
تعد الأقواس الهلالية عنصراً بنيوياً إلزامياً في الصياغة القياسية؛ إذ تحدد النطاق المرجعي الذي يجب على محرك SAS مطابقته مع المتغير. غياب هذه الأقواس أو استبدالها بأقواس معقوفة يؤدي حتماً إلى توقف المترجم وإصدار خطأ نحوي فوري. تتيح هذه الحاوية المنطقية للمترجم حجز مصفوفة مؤقتة في الذاكرة لتخزين عناصر المقارنة ومقارنتها بالقيمة الحالية للمتغير في كل دورة تنفيذية.
تتحدد الفواصل المعتمدة داخل القائمة بناءً على التقاليد البرمجية لبيئة SAS؛ فبينما يفضل المبرمجون استخدام الفاصلة العادية (Comma) للفصل بين العناصر لضمان أعلى درجات الوضوح البصري، فإن مترجم SAS يدعم أيضاً في سياقات معينة استخدام المسافات الفارغة للفصل بين القيم داخل الأقواس. ومع ذلك، تبقى الفاصلة التقليدية هي الخيار الأضمن لتجنب أي لبس في التفسير، ولا سيما عند التعامل مع المتغيرات النصية التي قد تحتوي بحد ذاتها على مسافات ضمنية.
2.2 الفروق الدقيقة بين الصيغ الصريحة والبدائل الرمزية
توفر لغة SAS مرونة نحوية تتيح كتابة معامل الاستبعاد بصيغ متعددة تؤدي وظيفياً المعنى ذاته، حيث يمكن استخدام الصيغة اللفظية الصريحة المتمثلة في الكلمات الإنجليزية المباشرة، أو اللجوء إلى الرموز الخاصة التي تعبر عن عملية النفي البولياني. من أشهر هذه البدائل الرمزية استخدام علامة التلدة مقرونة بالمعامل المنطقي، أو استخدام علامة القبعة الرياضية كبديل نفي وظيفي.
تختلف درجة التوافق لهذه الرموز الخاصة باختلاف بيئات وأنظمة التشغيل التي تستضيف خوادم SAS، مثل منصات يونكس ولينكس مقابل بيئات مايكروسوفت ويندوز أو الحواسيب المركزية الكبيرة (Mainframes). قد تخضع الرموز غير الأبجدية، مثل علامة النفي الرمزية، لاختلافات في جداول ترميز المحارف الموسعة، مما قد يتسبب أحياناً في أخطاء تجميع غامضة عند ترحيل الأكواد بين منصات تشغيلية متباينة برمجياً.
استناداً إلى معايير هندسة البرمجيات وتوصيات كتابة الكود النظيف في الأوساط الأكاديمية والسريرية، يُوصى دائماً بتفضيل الصيغة اللفظية الصريحة، أي كتابة الكلمات بالكامل بحروف واضحة. يضمن هذا النهج قراءة متجانسة للنص البرمجي، ويلغي أي لبس تقني قد ينشأ عن تفسير الرموز عبر البيئات الحسابية المختلفة، كما يسهل على المراجعين والمدققين الخارجيين استيعاب المنطق الاستبعادي بيسر ودون الحاجة لتفسير الرموز البديلة.
2.3 قواعد التنسيق الخاصة بعناصر القائمة المستهدفة
يتطلب إدخال عناصر القائمة المستهدفة ضمن معامل NOT IN التزاماً دقيقاً بقواعد كتابة المصفوفات الثابتة لضمان عدم حدوث أخطاء توقف خطوة الترجمة والتنفيذ. يجب أن تنتمي جميع العناصر المدخلة داخل القائمة إلى المجال الدلالي لنوع المتغير ذاته؛ فلا يجوز خلط القيم الرقمية البحتة مع النصوص داخل قائمة واحدة دون مراعاة شروط التنسيق الخاصة بكل نوع على حدة.
تفرض بيئة SAS قيوداً معمارية متقدمة تتعلق بالحد الأقصى لطول التعبير الشرطي المنطقي وسعة الذاكرة المخصصة لتحليل النصوص البرمجية أثناء خطوة الترجمة. ورغم أن القوائم القصيرة والمتوسطة تُعالج بمرونة فائقة، إلا أن حشو القائمة بآلاف العناصر المكتوبة يدوياً قد يؤدي إلى استنزاف مساحة الذاكرة المخصصة لمفسر الأوامر، مما يستدعي في مثل تلك الحالات اللجوء إلى جداول بحثية أو استعلامات فرعية منظمة بدلاً من القوائم الثابتة المباشرة.
تؤثر الفراغات وعلامات التنصيص تأثيراً مباشراً على صحة التعبير البرمجي؛ فالمتغيرات النصية تتطلب حصر كل قيمة ضمن علامتي تنصيص متماثلتين، سواء كانت مفردة أو مزدوجة، مع الحذر التام من إدراج مسافات زائدة غير مقصودة داخل علامات التنصيص. فأي مسافة إضافية داخل علامات التنصيص تُعد جزءاً أصيلاً من القيمة النصية ذاتها، مما يفشل عملية المطابقة المنطقية ويقود إلى بقاء سجلات كان يُفترض استبعادها حتماً.
3. تطبيق معامل “NOT IN” ضمن خطوة البيانات (DATA Step)
3.1 تصفية السجلات باستخدام جملة WHERE مع NOT IN
تمثل جملة WHERE في خطوة البيانات الأسلوب الأمثل والأكثر كفاءة لتصفية السجلات، حيث تعمل كمرشح أولي يُطبق مباشرة أثناء مرحلة قراءة البيانات من وحدة التخزين الدائمة وقبل تحميل السجل في مصفوفة البيانات البرمجية المؤقتة، المعروفة باسم موجه بيانات البرنامج (Program Data Vector – PDV). يؤدي هذا التموضع المتقدم إلى تجنب قراءة السجلات غير المستهدفة بالكامل.
ينعكس هذا السلوك المعماري إيجابياً على كفاءة استخدام موارد النظام؛ إذ يُعفى المعالج المركزي من تخصيص دورات حسابية لبناء المتغيرات وتخصيص الذاكرة للملاحظات التي ستُستبعد لاحقاً. عندما تقترن جملة WHERE بمعامل NOT IN، يقوم محرك SAS بقراءة معايير الاستبعاد، وتجاوز كل قيد يطابق أي عنصر من عناصر القائمة فوراً من القرص، مما يوفر نطاقاً ترددياً واسعاً في عمليات الإدخال والإخراج.
تتجلى التطبيقات العملية لهذا الاستخدام عند الرغبة في استبعاد مراكز طبية معينة من دراسة سريرية، أو حجب مناطق جغرافية محددة من تحليل مالي موسع. من خلال صياغة عبارة مثل:
WHERE Region NOT IN (‘North’, ‘South East’);
يضمن المحلل أن الجدول الناتج سيقتصر فقط على المناطق الأخرى، دون أن تتحمل بيئة التشغيل أي أعباء حسابية مرتبطة بمعالجة بيانات المنطقتين المستبعدتين نهائياً.

3.2 استخدام جملة IF الشرطية المقترنة بمعامل NOT IN
تختلف جملة IF الشرطية اختلافاً جوهرياً عن جملة WHERE من حيث دورة حياة المعالجة داخل خطوة البيانات. فبينما تعمل الأخيرة أثناء جلب البيانات من القرص، تُنفذ جملة IF بعد أن يتم تحميل السجل بالكامل داخل موجه بيانات البرنامج وتنفيذ كافة العمليات الحسابية والتحويلية التي تسبقها في الترتيب البرمجي لخطوة البيانات.
يسمح هذا التمايز التقني باستخدام جملة IF التصفوية مع المتغيرات التي تُستحدث أو تُحسب ديناميكياً أثناء تشغيل خطوة البيانات نفسها، وهي المتغيرات التي تعجز جملة WHERE عن الوصول إليها لأنها لا تكون موجودة في الجدول المصدر الأصلي. عند دمج جملة IF مع معامل NOT IN، يُتاح للمحلل صياغة شروط إبقاء إيجابية، أو استخدام عبارة DELETE لإسقاط الحالات المستهدفة فوراً:
IF Risk_Category NOT IN (‘Low’, ‘Moderate’) THEN DELETE;
تتطلب هذه المرونة وعياً عميقاً من جانب المبرمج؛ إذ إن استخدام جملة IF بدلاً من WHERE على المتغيرات الأصلية الموجودة مسبقاً في جدول الإدخال يؤدي إلى تحميل السجلات غير المرغوبة في الذاكرة أولاً ثم إسقاطها، وهو ما يستنزف دورات المعالجة دون مسوغ تقني. لذا، يجب حصر استخدام جملة IF المقترنة بمعامل الاستبعاد في الحالات التي تعتمد كلياً على منطق اشتقاقي ينشأ داخل دورة المعالجة الحالية.
3.3 دمج المعامل مع عبارة SET لإنشاء مجموعات بيانات فرعية
يمثل التكامل بين عبارة SET ومعامل التصفية NOT IN الركيزة الأساسية لإنشاء مجموعات بيانات جديدة ومحسنة تُشتق من مصادر بيانات أولية ضخمة. يتيح هذا الدمج عزل السجلات المتبقية التي استوفت شروط الاستبعاد، وتمريرها إلى جدول إخراج جديد يحتفظ بكافة الخصائص البنيوية والتوصيفية للمتغيرات الأصلية، مثل أسماء الأعمدة، والعناوين التفسيرية، وتنسيقات العرض الإحصائي.
خلال هذه العملية، يضمن نظام SAS نقل البيانات دون فقدان لسمات الميتاداتا الهامة؛ حيث تظل المتغيرات محتفظة بأطوالها المحددة وتسمياتها التحليلية الأصلية، مع استبعاد السجلات غير المطابقة للشرط. ويوفر النظام آلية تتبع دقيقة من خلال توثيق كل خطوة في سجل العمليات التشغيلي، المعروف باسم سجل SAS (SAS Log)، والذي يُعد المستند المرجعي الأول للتحقق من سلامة التنفيذ وجودته المعيارية.
يقدم سجل SAS تقريراً إحصائياً فورياً يوضح بدقة عدد السجلات التي تمت قراءتها من مجموعة البيانات الأصلية عبر عبارة SET، مقارنة بعدد السجلات التي استقرت فعلياً في مجموعة البيانات الناتجة بعد تطبيق شرط الاستبعاد. تتيح هذه الإحصائيات للمحلل التحقق الحسابي من أن عدد الملاحظات المستبعدة يتطابق تماماً مع الفرضية التحليلية ومجموع الحالات المستهدفة بالاستثناء في خطة العمل الموضوعة مسبقاً.
4. استخدام معامل “NOT IN” في استعلامات إجراء SQL (PROC SQL)
4.1 بنية استعلام PROC SQL الأساسية مع تصفية NOT IN
يوفر إجراء الاستعلامات البنيوية PROC SQL في بيئة SAS نافذة قوية للتعامل مع البيانات وفق المعايير الدولية المعتمدة من المعهد الوطني الأمريكي للمقاييس عبر معيار لغة SQL الموحدة. تتيح هذه الأداة لمحللي البيانات صياغة شروط الاستبعاد باستخدام بنية استعلامية مألوفة تعتمد على عبارة SELECT المقترنة ببند WHERE الذي يحتضن معامل NOT IN بصورة متوافقة تماماً مع قواعد قواعد البيانات العلائقية.
تتم كتابة الشرط الاستبعادي في بنية SQL الأساسية باتباع النسق التالي:
SELECT Employee_ID, Department, Salary FROM Corporate.Staff WHERE Department NOT IN (‘Human Resources’, ‘Public Relations’);
يتولى محرك SQL الداخلي لبيئة SAS تحليل هذا الاستعلام وبناء خطة استخلاص تضمن فحص كل سجل واستبعاد من تنطبق عليهم هذه السمات الوظيفية، مع إمكانية توجيه النتائج مباشرة إلى شاشة العرض أو حفظها في جدول جديد باستخدام أمر CREATE TABLE.
تتميز استعلامات PROC SQL بقدرتها على توفير بيئة فحص سريعة وموثوقة للتحقق من دقة التصفية. يمكن للمحلل إجراء استعلامات عكسية سريعة تبحث حصراً عن الحالات المستبعدة للتأكد من انطباق المعايير عليها قبل اعتماد الجدول المنقى، مما يشكل خطوة احترازية تدعم موثوقية التحليلات اللاحقة وتقلل احتمالات حدوث تشوهات غير مدركة في البيانات النهائية.
4.2 مقارنة أداء الاستعلام بين PROC SQL وخطوة DATA
يخضع الاختيار بين استخدام خطوة البيانات التقليدية وإجراء PROC SQL لاعتبارات تقنية ترتبط بآلية تحسين الاستعلامات والموارد الحسابية المتاحة. يمتلك إجراء PROC SQL محركاً داخلياً لتحسين الاستعلامات (Query Optimizer) يقوم بتقييم العبارة البرمجية واختيار أفضل مسار حوسبي لتنفيذها، بما في ذلك تحديد ما إذا كان من الأجدى استخدام الفهارس الموجودة مسبقاً على الجداول أو إجراء مسح تتابعي شامل.
تلعب الفهارس (Indexes) دوراً محورياً في تسريع وتيرة تنفيذ معامل NOT IN داخل PROC SQL؛ فإذا كان المتغير المفحوص يمتلك فهرساً بيانياً مسبقاً، قد يتمكن المحرك من استخدام هذا الفهرس لتحديد مواقع الملاحظات المطلوب استبعادها مباشرة وتخطيها دون فحص الجدول بأكمله، وهو ما يتفوق في بعض الحالات المعقدة على المسح الخطي في خطوة البيانات، ولا سيما عند الربط بين جداول متعددة بالتزامن مع تطبيق الاستبعاد.
ومع ذلك، تظل خطوة البيانات عبر جملة WHERE المباشرة هي الخيار الأكثر كفاءة وسرعة في السيناريوهات الخطية البسيطة التي تتضمن جدولاً واحداً دون عمليات ربط معقدة؛ نظراً لانخفاض الأعباء التفسيرية على المترجم مقارنة بمحرك SQL. لذا يفضل المحللون استخدام خطوة البيانات للتصفيات الأحادية المباشرة، في حين يُلجأ إلى PROC SQL عندما يكون شرط الاستبعاد جزءاً من منظومة دمج تجميعية أو استعلام علائقي مركب.
4.3 توظيف الاستعلامات الفرعية (Subqueries) بالتكامل مع NOT IN
تتجلى القوة الاستثنائية لإجراء PROC SQL عند استخدام معامل NOT IN مقترناً بالاستعلامات الفرعية (Subqueries)، حيث تنتقل عملية الاستبعاد من الاعتماد على قوائم ثابتة ومحددة سلفاً إلى اعتماد الاستبعاد الديناميكي الذي يتغذى مباشرة من نتائج استعلام فرعي مستقل يتم تنفيذه في الوقت الفعلي أثناء المعالجة.
يظهر النموذج المعياري لهذا الأسلوب في الصياغة البرمجية التالية:
SELECT * FROM Operations.Orders WHERE Customer_ID NOT IN (SELECT Blacklisted_ID FROM Compliance.Restricted_Accounts);
في هذا السياق، يقوم محرك SAS بتشغيل الاستعلام الداخلي أولاً لبناء قائمة ديناميكية بأرقام الحسابات المحظورة، ثم يمرر هذه القائمة كمعيار استبعاد للاستعلام الرئيسي، مما يضمن تحديث قرارات التصفية تلقائياً وفق أحدث البيانات المتاحة في جدول الامتثال دون الحاجة لتعديل الكود يدوياً.
تتطلب هذه المنهجية حذراً بالغاً تجاه معضلة الاستعلامات الفرعية التي قد تُعيد قيماً فارغة أو مصفوفات غير مكتملة؛ فإذا احتوت النتائج الناتجة عن الاستعلام الفرعي على قيمة مفقودة واحدة (NULL)، فإن المنطق الرياضي لمعامل NOT IN في لغة SQL قد يتعطل بالكامل ويؤدي إلى إرجاع مجموعة نتائج فارغة تماماً، وهو مأزق تقني شهير سنفصل أسبابه الرياضية وآليات تجنبه لاحقاً في هذا المقال.
5. التعامل مع المتغيرات النصية (Character Variables) باستخدام NOT IN
5.1 إشكالية حساسية حالة الأحرف (Case Sensitivity)
تتعامل بيئة SAS مع السلاسل النصية بحساسية مطلقة لحالة الأحرف استناداً إلى جدول قيم التشفير المعياري؛ حيث يُعد الحرف اللاتيني الكبير كياناً رقمياً مستقلاً تماماً ومختلفاً في قيمته الثنائية عن الحرف الصغير المقابل له. يمتد هذا المبدأ ليشمل مقارنات النصوص بمختلف اللغات وتنسيق المحارف ذات الصلة.
يترتب على هذه الحساسية المفرطة مخاطر تحليلية جسيمة عند تطبيق معامل NOT IN؛ فإذا كان شرط الاستبعاد يتضمن القيمة النصية ‘Active’، واحتوت البيانات المدخلة على صيغ متباينة مثل ‘ACTIVE’ أو ‘active’، فإن المعامل سيتعامل مع هذه الصيغ كقيم مختلفة تماماً ولن يقوم باستبعادها، مما يبقيها داخل مجموعة البيانات التحليلية خلافاً لما كان يهدف إليه المبرمج.
تؤدي هذه الإشكالية إلى تداعيات سلبية خطيرة في جودة التقارير الإحصائية، حيث يؤدي التساهل في إدارة حالة الأحرف إلى استثناءات خاطئة للبيانات أو تشويه حجم العينات الخاضعة للدراسة. لذا يصبح لزاماً على محلل البيانات تبني استراتيجيات صارمة لتوحيد التمثيل النصي للبيانات قبل إخضاعها لأي مقارنات استبعادية لضمان تطابق الأنماط الحرفية تطابقاً تاماً.
5.2 توحيد النصوص البرمجية باستخدام دوال UPCASE وLOWCASE
يتمثل الحل البرمجي القياسي لتفادي أخطاء حساسية حالة الأحرف في توظيف دوال المعالجة النصية، وعلى رأسها دالة UPCASE ودالة LOWCASE، لتحويل محتوى المتغير وقيم قائمة الاستبعاد إلى حالة حرفية موحدة قبل إجراء الفحص المنطقي، مما يضمن تحييد أي تباين في أسلوب إدخال البيانات الأصلي.
تُصاغ الشروط المركبة في خطوة البيانات بالاعتماد على هذا الأسلوب الوقائي كما يلي:
WHERE UPCASE(Status_Code) NOT IN (‘TERMINATED’, ‘SUSPENDED’, ‘CLOSED’);
في هذا التعبير، تضمن دالة UPCASE تحويل كل قيمة واردة في المتغير إلى أحرف كبيرة بصورة مؤقتة أثناء التقييم المنطقي، ومقارنتها بالقائمة المكتوبة بأحرف كبيرة أيضاً، مما يؤدي إلى استبعاد كافة السجلات المستهدفة بصرف النظر عن الكيفية التي كُتبت بها في الأصل.
ومع ذلك، ينبغي على المحلل تقييم الأثر الحسابي لهذا التحويل عند التعامل مع مجموعات بيانات ضخمة تضم مئات الملايين من السجلات. فتطبيق دالة نصية على كل ملاحظة يستهلك قدراً من دورات المعالجة المركزية، مما يجعل تنظيف البيانات وتوحيد حالتها النصية بشكل مسبق ودائم في مراحل إعداد البيانات المبكرة خياراً أفضل من إعادة التحويل الحسابي في كل استعلام استبعادي متكرر.
5.3 معالجة المسافات البيضاء والرموز الخفية باستخدام دوال التهيئة
تعد المسافات البيضاء الزائدة والرموز غير المرئية من أكثر الأسباب الخفية التي تؤدي إلى فشل التصفية باستخدام معامل NOT IN في المتغيرات النصية. ففي لغة SAS، تُملأ المتغيرات النصية ذات الطول الثابت بمسافات فارغة مكملة حتى نهاية الطول المحدد للحقل، إضافة إلى إمكانية احتواء البيانات على مسافات بادئة أو لاحقة نتجت عن أخطاء إدخال يدوية أو مشكلات أثناء استيراد الملفات النصية المسطحة.
للتغلب على هذه العقبة، تبرز أهمية دوال التهيئة النصية مثل دالة STRIP ودالة TRIM. تقوم دالة STRIP بإزالة كافة المسافات الفارغة البادئة واللاحقة من القيمة النصية، في حين تقتصر دالة TRIM على إزالة المسافات اللاحقة فقط. يُفضل دائماً استخدام دالة STRIP مقترنة بمعامل الاستبعاد لضمان نقاء السلسلة النصية ومطابقتها التامة مع عناصر القائمة:
WHERE STRIP(UPCASE(Country_Code)) NOT IN (‘USA’, ‘CAN’, ‘MEX’);
كما تكتسب دالة COMPBL أهمية خاصة عند التعامل مع النصوص الطويلة التي قد تفصل بين كلماتها مسافات بيضاء متعددة؛ حيث تعمل هذه الدالة على تقليص الفراغات الداخلية المتكررة واستبدالها بمسافة بيضاء مفردة. وإذا اشتملت البيانات على رموز تحكم خفية أو محارف جدولة ناتجة عن عمليات الاستيراد، فإن الاستعانة بدالة COMPRESS لتنقية المتغير من تلك الرموز الخفية يمثل صمام الأمان لمنع تعطل دقة معامل NOT IN في تصفية النصوص.
6. التعامل مع المتغيرات العددية (Numeric Variables) وتفادي أخطاء التحويل
6.1 تحديد القوائم الرقمية المستهدفة وصياغتها الرياضية
يتطلب استخدام معامل NOT IN مع المتغيرات العددية في لغة SAS صياغة رياضية منضبطة تختلف عن نظيرتها النصية؛ حيث يتم إدراج الأرقام داخل الأقواس كقيم حسابية مجردة تخلو تماماً من علامات التنصيص الفردية أو المزدوجة. إن إضافة أي علامة تنصيص حول الرقم يحوله فوراً في المنظور البرمجي إلى سلسلة محارف، مما يربك المترجم ويقود إلى سلوكيات معالجة غير مرغوبة.
تُفصل القيم الرقمية داخل القائمة بالاعتماد على الفواصل التقليدية مع ترك مسافات اختيارية لتعزيز وضوح الشيفرة، كما في النموذج التالي:
WHERE Clinical_Stage NOT IN (1, 2, 4);
يتعامل المفسر في هذه الحالة مع القيم كأعداد صحيحة مباشرة، وتتم عمليات المقارنة على المستوى الثنائي الداخلي للبيانات، مما يضمن أقصى درجات السرعة الحسابية الممكنة أثناء فحص السجلات ومطابقتها.
تتطلب المتغيرات الرقمية المقترنة بتنسيقات عرض خاصة، مثل التواريخ والقيم النقدية وتنسيقات المستخدم الخاصة، إدراكاً تاماً لحقيقة أن نظام SAS يخزن هذه المتغيرات كأرقام حقيقية مجردة، وليس كما تبدو للمستخدم على الشاشة. فعلى سبيل المثال، تُخزن التواريخ كعدد الأيام المنقضية منذ الأول من يناير عام 1960. وبالتالي، يجب أن تتم التصفية باستخدام القيم العددية الحقيقية أو باستخدام ثوابت التواريخ المعيارية المتبوعة بالحرف D، لتفادي المقارنة غير الصحيحة مع القيم المعروضة ظاهرياً.

6.2 الدقة الحسابية وتمثيل الأرقام العشرية (Floating-Point)
تمثل الدقة الحسابية وتمثيل الأرقام العشرية وفق معيار الحوسبة الدولي IEEE 754 للنقاط العائمة أحد أعقد التحديات التقنية التي تواجه محللي البيانات عند استخدام معامل NOT IN. فالأرقام الكسرية لا تُخزن في الذاكرة الحاسوبية كقيم مطلقة في كثير من الأحيان، بل كتقريبات ثنائية دقيقة جداً قد تتفاوت عن قيمتها الاسمية بفارق ضئيل للغاية في المراتب العشرية المتأخرة.
يؤدي هذا التباين الضمني إلى فشل غير متوقع لشرط الاستبعاد المنطقي؛ فعلى سبيل المثال، قد لا تتطابق القيمة المحسوبة ديناميكياً لمتغير رقمي ناتج عن قسمة حسابية مع الثابت المكتوب داخل قائمة NOT IN بفارق جزء من تريليون. يفسر مفسر SAS هذا الفارق الحسابي متناهي الصغر على أنه عدم تساوي، مما يمنع استبعاد السجل ويؤدي إلى بقائه ضمن البيانات النهائية دون إدراك فوري من المحلل لوجود هذا الخطأ الخفي.
لضمان الحصانة ضد هذه المعضلة الحسابية، يُنصح بتجنب تضمين الأرقام العشرية المباشرة في قوائم الاستبعاد، أو اللجوء إلى معالجة المتغير بدوال التقريب المناسبة، مثل دالة ROUND، قبل تمريره إلى معامل الاستبعاد المنطقي. يحدد المبرمج درجة التقريب المطلوبة بما يتوافق مع الدقة القياسية للتجربة، مما يعيد ضبط التمثيل الثنائي للرقم ويسمح للمعامل بإجراء المطابقة الرقمية بدقة لا تتأثر بخصائص النقاط العائمة:
WHERE ROUND(Dosage_Level, 0.01) NOT IN (0.25, 0.50, 0.75);
6.3 تجنب التحويل التلقائي بين الأنواع (Type Conversion Warnings)
يؤدي عدم التطابق بين نوع المتغير ونوع عناصر قائمة الاستبعاد إلى إطلاق آلية التحويل التلقائي الضمني في بيئة SAS؛ فإذا ما طُبق معامل NOT IN يحتوي على قيم نصية محصورة بين علامات تنصيص على متغير معرف كمتغير عددي، أو العكس، فإن النظام يتدخل لمحاولة حل هذا التعارض عبر تحويل القيم قسرياً أثناء وقت التشغيل الفعلي.
يوثق سجل SAS هذا السلوك على الفور بإصدار رسائل تنبيه وتحذير صريحة تشير إلى تحويل القيم من رقمية إلى نصية أو العكس (NOTE: Numeric values have been converted to character values). ورغم أن الكود قد يكمل تنفيذه في بعض الأحيان، إلا أن هذا التحويل الضمني يُعد ممارسة برمجية سيئة ومحفوفة بالمخاطر؛ إذ يعتمد على افتراضات افتراضية لتنسيقات التحويل قد لا تتوافق مع بنية البيانات الأصلية.
يترتب على التحويل الضمني أثر سلبي بالغ على أداء المعالجة؛ حيث يُجبر النظام على استدعاء خوارزميات التحويل الميكانيكي لكل سجل على حدة، مما يؤدي إلى تباطؤ ملحوظ في سرعة التنفيذ قد تصل إلى أضعاف الوقت المستغرق في المقارنات المتجانسة. علاوة على ذلك، يرفع هذا السلوك من احتمالية تحول بعض القيم النصية غير المتوافقة إلى قيم مفقودة أثناء التحويل، مما يدخل تشوهات حسابية جسيمة في تدفق البيانات. وتقتضي الممارسة الفضلى التحقق الصارم والمسبق من مطابقة نوع المتغير مع نوع عناصر قائمة الاستبعاد قبل التنفيذ.
7. معضلة القيم المفقودة (Missing Values) وتأثيرها على منطق الاستبعاد
7.1 فلسفة المنطق ثلاثي الحالات (Three-Valued Logic) في الاستعلام
تخضع قواعد البيانات الحديثة وأنظمة التحليل المتقدمة لمنظومة المنطق ثلاثي الحالات، حيث تتجاوز التقييمات الشرطية حدود الصواب والخطأ التقليدية لتشمل حالة ثالثة هي القيمة المجهولة أو المفقودة. تختلف بيئة SAS في هذا السياق باختلاف المحرك المستخدم؛ فبينما يتبنى محرك SQL المنطق الثلاثي الكامل باعتبار القيمة الفارغة حالة عدم يقين رياضي، تتعامل خطوة البيانات في SAS مع القيم المفقودة كقيم حقيقية لها ترتيب تسلسلي خاص في الذاكرة.
ترتب بيئة SAS القيم المفقودة العددية بوصفها أصغر قيمة عددية ممكنة، بحيث تكون أصغر رياضياً من أي رقم سالب، في حين تمثل القيمة المفقودة النصية بسلسلة فارغة من المسافات تُصنف كأصغر قيمة نصية من حيث الترتيب الهجائي. يترتب على هذا الترتيب البنيوي نتائج غير متوقعة تماماً عند تطبيق معامل NOT IN إذا لم يتم استيعاب الفلسفة الداخلية لتعامل النظام مع هذه المعطيات بدقة تامة.
تتضح هذه المعضلة بجلاء عند احتواء قائمة الاستبعاد نفسها على قيم مفقودة، أو عند فحص سجلات تحتوي على قيم مفقودة مقابل قائمة أرقام محددة. ففي استعلامات PROC SQL المتوافقة مع معايير SQL الدولية، إذا اشتملت القائمة على قيمة فارغة (NULL)، فإن نتيجة المقارنة تصبح غير معرفة رياضياً لكافة السجلات، مما يتسبب في فشل الشرط المنطقي واستبعاد جميع السجلات أو حجبها بصورة تبدو للمحلل المبتدئ كعطل برمجي غامض داخل النظام.
7.2 التعامل مع القيم المفقودة النصية والعددية في تصفية البيانات
يتطلب التفريق بين السلوك التطبيقي للقيم المفقودة النصية والعددية فهماً عميقاً لرموز النظام؛ فالقيمة المفقودة القياسية للمتغيرات العددية في SAS يُرمز لها بنقطة مفردة (.)، في حين يُرمز للقيم المفقودة الخاصة، المستخدمة لتمثيل أسباب الفقدان المتنوعة في الدراسات المتقدمة، بنقطة متبوعة بحرف أبجدي من A إلى Z أو علامة الشرطة السفلية (.A – .Z, ._). أما المتغيرات النصية، فتكون قيمتها المفقودة عبارة عن سلسلة من المسافات الفارغة تماماً (‘ ‘).
عند تنفيذ شرط استبعاد مثل:
WHERE Score NOT IN (80, 90, 100);
فإن السجلات التي تحتوي على قيمة مفقودة عددية في متغير Score ستُعتبر غير متطابقة مع قيم القائمة (لأن النقطة لا تساوي 80 ولا 90 ولا 100). ونتيجة لذلك، يتم الاحتفاظ بالقيم المفقودة داخل مجموعة البيانات الناتجة. يغيب هذا السلوك أحياناً عن ذهن الباحث الذي يفترض ضمناً أن الاستبعاد يقتصر على الحالات المقاسة فقط دون الحالات غير المكتملة.
يقود هذا الاحتفاظ غير المقصود بالقيم المفقودة إلى تشويه الحسابات الإحصائية اللاحقة، مثل حساب المتوسطات الحسابية أو الانحرافات المعيارية، حيث تدخل تلك الحالات الفارغة ضمن العينة المستبقاة دون مبرر علمي. وعلى النقيض من ذلك، إذا أدرج المبرمج القيمة المفقودة صراحة ضمن القائمة بهدف استبعادها، قد يؤدي ذلك إلى إسقاط حالات كان ينبغي إخضاعها لتحليلات الفقدان المتخصصة، مما يفرض توخي أقصى درجات اليقظة الإحصائية.
7.3 استراتيجيات وقائية للتحكم في القيم المفقودة أثناء الاستبعاد
تتطلب السيطرة المحكمة على البيانات أثناء تطبيق معامل الاستبعاد المنطقي بناء استراتيجيات وقائية تستند إلى صياغة شروط واضحة ومحددة لإدارة القيم المفقودة، بدلاً من تركها للتقييم التلقائي الذي قد يتأثر بالسياق البرمجي لخطوة المعالجة أو نوع المحرك المشغل.
تتمثل إحدى أقوى الاستراتيجيات الوقائية في عزل منطق التحقق من القيم المفقودة من خلال دمجه كشرط استباقي مقترن بمعامل العطف المنطقي؛ حيث يتم النص صراحة على استبعاد أو تضمين القيم المفقودة باستخدام تعبيرات معيارية غير قابلة للتأويل، مثل IS NOT MISSING أو استخدام دوال الفحص المتخصصة، كما يظهر في النموذج البرمجي التالي:
WHERE Test_Result IS NOT MISSING AND Test_Result NOT IN (0, -99);
يضمن هذا الأسلوب المزدوج إسقاط السجلات ذات القيم المفقودة أولاً، ثم تطبيق معامل الاستبعاد على البيانات الفعلية المتبقية، مما يلغي أي احتمال لتداخل منطق الفقدان مع منطق التصفية العددية. كما توفر دالة MISSING مرونة فائقة لكافة أنواع المتغيرات (سواء كانت نصية أو رقمية)؛ إذ تُعيد القيمة واحد إذا كان المتغير مفقوداً وذكاءً حسابياً موازياً، مما يجعل استخدامها كمرشح أولي ركيزة أساسية في تصميم قواعد أعمال رصينة تلبي المعايير الإحصائية المعتمدة عالمياً.
8. المقارنة المعيارية: معامل “NOT IN” مقابل البدائل المنطقية المتعددة
8.1 المقارنة بين NOT IN وتكرار المعاملات المنطقية المترابطة
تمثل المقارنة بين معامل NOT IN والبدائل الكلاسيكية القائمة على تكرار معاملات عدم التساوي المقترنة بمعامل العطف AND دراسة حالة واضحة في فلسفة الوضوح البرمجي والكفاءة الهندسية للشيفرات؛ إذ يمكن التعبير عن استبعاد ثلاث قيم برمجياً عبر الصيغة التقليدية:
(Var NE ‘A’ AND Var NE ‘B’ AND Var NE ‘C’)
مقابل الصيغة المكافئة وظيفياً:
Var NOT IN (‘A’, ‘B’, ‘C’)
تتجلى الميزة الكبرى لمعامل NOT IN في تعزيز قابلية قراءة الشيفرة وسهولة مراجعتها وتدقيقها؛ فالصيغة المتعددة لمعاملات عدم التساوي تتطلب تكرار كتابة اسم المتغير عدة مرات، مما يفتح الباب واسعاً أمام الأخطاء الطباعية أو إغفال أحد الشروط أثناء التعديلات السريعة. كما أن قراءة الجمل المنطقية المختصرة تتيح للمدققين استيعاب الهدف التحليلي في ثوانٍ معدودة مقارنة بفك شفرات الجمل الممتدة التي تربك العين المجردة.
من الناحية المنطقية الصرفة، يسقط العديد من المبرمجين في خطأ كارثي شهير عند محاولة الاستبعاد الفردي عبر استبدال معامل العطف AND بمعامل الاختيار OR بالصيغة الخاطئة: (Var NE ‘A’ OR Var NE ‘B’). يقود هذا الخطأ المنطقي إلى بقاء كافة السجلات دون استثناء؛ لأن أي قيمة ستكون حتماً غير مساوية لأحد الشرطين دائماً. يحمي معامل NOT IN المحلل من الوقوع في هذا الفخ المنطقي الساذج؛ لأنه يطبق منطق النفي الشامل على المصفوفة بأكملها بصورة رياضية محكمة وغير قابلة للبس.
8.2 المقارنة مع تقنيات البحث في الجداول ودمج البيانات (Hash Objects & Merging)
تتغير المفاضلة الفنية بين استخدام معامل NOT IN والتقنيات الهيكلية المتقدمة كلما تضخمت قائمة عناصر الاستبعاد وارتفع حجم البيانات المعالجة؛ حيث تبرز كائنات التجزئة Hash Objects وتقنيات الدمج غير المتطابق (Match-Merging) كحلول حوسبية بديلة ذات كفاءة استثنائية عند التعامل مع قوائم استبعاد تضم عشرات الآلاف أو ملايين المعايير.
تعتمد كائنات التجزئة Hash Objects على تحميل قائمة الاستبعاد في الذاكرة العشوائية السريعة داخل بنية شجرية تتيح البحث بزمن شبه ثابت O(1) بصرف النظر عن حجم القائمة، وهو ما يتفوق بمراحل على البحث التتابعي الذي قد يضطر مترجم SAS لإجرائه عند فحص قائمة استبعاد عملاقة مكتوبة عبر معامل NOT IN. يُبين الجدول التالي الحدود الفاصلة المفضلة لاختيار التقنية المناسبة بناءً على طبيعة المهمة الحوسبية:
| الخاصية / المعيار | معامل NOT IN | كائنات التجزئة (Hash Objects) | الدمج غير المتطابق (Merge In=) |
|---|---|---|---|
| حجم قائمة الاستبعاد | صغير إلى متوسط (أقل من 1000 عنصر) | ضخم جداً (مئات الآلاف إلى ملايين) | ضخم ومخزن في جداول دائمة مسبقاً |
| سهولة الصياغة البرمجية | بسيطة للغاية وقابلة للقراءة الفورية | تتطلب كوداً متقدماً وتعريف كائنات | متوسطة، تتطلب فرزاً مسبقاً للجداول |
| استهلاك الذاكرة العشوائية | منخفض جداً وشبه معدوم | مرتفع (يحمل القائمة بالكامل في RAM) | منخفض جداً ويعتمد على وسائط التخزين |
| المرونة مع القوائم المتغيرة | منخفضة (تتطلب تعديل الكود أو ماكرو) | عالية جداً (تقرأ من أي جدول ديناميكي) | عالية جداً (تعتمد على تحديث الجداول) |
يمثل حاجز الألف عنصر نقطة التحول المعيارية؛ فإذا كانت قائمة الاستبعاد محدودة وثابتة، فإن استخدام NOT IN هو الخيار المنطقي والأمثل برمجياً لتجنب التعقيد الإنشائي للأكواد. أما إذا كانت القائمة مستخلصة من جداول خارجية متغيرة باستمرار وتتجاوز أحجامها السعات النصية البسيطة، فإن التحول نحو كائنات التجزئة أو استراتيجيات دمج البيانات يمثل القرار المعماري الأضمن لتحقيق استقرار النظام وتفادي انهيار بيئة التنفيذ.
8.3 تقييم الكفاءة واستهلاك موارد النظام (CPU & Memory Profiling)
يتطلب اتخاذ قرارات هندسية حاسمة في بيئات الإنتاج الكبرى إخضاع الخيارات البرمجية لاختبارات الأداء المعيارية وقياس استهلاك الموارد بدقة، وهو ما توفره بيئة SAS عبر تفعيل خيارات القياس المتقدمة مثل FULLSTIMER وSTIMER في سجل النظام لمراقبة زمن المعالجة الفعلي واستهلاك الذاكرة ومعدلات الإدخال والإخراج.
عند تفعيل هذه الخيارات ومقارنة تنفيذ معامل NOT IN مع الشروط التكرارية البديلة على مجموعة بيانات تحتوي على 50 مليون سجل، تُظهر النتائج أن معامل NOT IN يحقق تقارباً كبيراً في زمن المعالجة مع عبارات AND المتسلسلة المكتوبة بدقة، إلا أنه يتفوق بوضوح في تقليل الوقت الإجمالي المستغرق في مرحلة الترجمة والتحليل النحوي، نظراً لتعامل المفسر مع مصفوفة قيم موحدة بدلاً من تحليل شجرة تعبيرات منطقية متشعبة.
يؤثر طول بنية القائمة المدخلة داخل معامل NOT IN تأثيراً مباشراً على أداء المترجم؛ فزيادة عدد العناصر النصية الطويلة داخل القائمة يرفع من استهلاك الذاكرة المخصصة لمساحة تحليل التعبيرات، وقد يؤدي في الحالات القصوى إلى بطء ملحوظ في مرحلة البدء. توصي المعايير المتقدمة بضرورة مراجعة السجل البرمجي والاعتماد على الفهارس المسبقة لتحويل عمليات الفحص المنطقي إلى عمليات بحث مباشر عبر الأشجار الثنائية للمحرك، مما يقلص زمن المعالجة الكلي إلى أدنى مستوياته الممكنة.
9. تطبيقات ودراسات حالة عملية باستخدام بيانات واقعية
9.1 استبعاد مجموعات ضابطة أو فرق محددة في تحليل البيانات
في سياق التحليلات المؤسسية المتقدمة وتقييم أداء المنشآت متعددة الفروع، تبرز الحاجة المستمرة لاستبعاد مجموعات معينة من التقارير التشغيلية القياسية؛ كأن يتم استبعاد الفرق التجريبية أو المكاتب الإقليمية التي تخضع لبرامج إعادة هيكلة مؤقتة لضمان عدم تأثير بياناتها غير النمطية على المؤشرات العامة لبقية المؤسسة.
يوضح النموذج التطبيقي التالي كيفية عزل تلك المجموعات بأسلوب برمجي منضبط، مع فصل السجلات المستبعدة في جدول مستقل لإخضاعها لتدقيق منفصل، وإعادة احتساب المقاييس الإحصائية الوصفية للحالات المتبقية فقط:
DATA Analytics.Active_Branches Analytics.Excluded_Branches;
SET Source.Corporate_Performance;
IF Branch_Code NOT IN (‘BR_104’, ‘BR_208’, ‘BR_999’) THEN DO;
OUTPUT Analytics.Active_Branches;
END;
ELSE DO;
OUTPUT Analytics.Excluded_Branches;
END;
RUN;

تسمح هذه المنهجية المزدوجة بالاحتفاظ بكافة البيانات وتوجيهها بدقة دون فقدان، ومن ثم استدعاء إجراء التحليل الإحصائي الوصفي PROC MEANS على جدول الفروع النشطة حصراً. يضمن هذا الإجراء إعادة حساب المتوسطات والتباينات ومعدلات الأداء التشغيلي بدقة مطلقة تعكس الواقع التشغيلي الحقيقي الخالي من تشوهات المجموعات المستثناة، مع توفير مسار تدقيق كامل للحالات المعزولة لفرق المراجعة الداخلية.
9.2 تنقية البيانات الاستقصائية ودراسات القياس الإحصائي
تمثل البيانات الاستقصائية والميدانية بيئة خصبة للأخطاء وقيم الاستجابة غير الصالحة التي يضعها جامعو البيانات لتسجيل حالات الرفض أو الامتناع عن الإجابة، مثل استخدام الأرقام الرمزية الشهيرة (-9، -99، 999). يشكل بقاء هذه الرموز الحسابية داخل مصفوفة التحليل خطراً جسيماً على مصداقية المقاييس الإحصائية ومعاملات الارتباط.
يُطبق معامل NOT IN لتنقية هذه العينات وضمان تصفية رموز الاستجابات غير الصالحة، بالإضافة إلى استبعاد أرقام المراكز الاستقصائية التي ثبت فشلها في استيفاء معايير ضبط الجودة الميدانية. يُصاغ شرط التصفية في خطوة بيانات منقحة تستهدف استبعاد تلك الاستجابات بصورة قطعية قبل البدء في حساب مقاييس الصدق والثبات الإحصائي، مثل معامل ألفا كرونباخ للاتساق الداخلي.
يختتم المحلل هذه المرحلة بتوثيق دقيق ومفصل يوضح حجم العينة الأصلي، وعدد الحالات التي أُسقطت نتيجة لتطبيق معايير الاستبعاد عبر معامل NOT IN، وحجم العينة الصافي المستقر في التحليل النهائي. يمثل هذا التوثيق ركيزة أصيلة في كتابة منهجية البحوث الرصينة، ويتيح للباحثين الآخرين تكرار التجربة ومطابقة خطوات المعالجة الرياضية بدقة متناهية تعزز الشفافية الأكاديمية.
9.3 اكتشاف الحالات الشاذة ومراقبة سلامة البيانات الإحصائية
يتجاوز دور معامل NOT IN حدود التصفية التقليدية ليصبح أداة استكشافية بالغة الأهمية في تدقيق سلامة البيانات واكتشاف الحالات الشاذة والقيم الخارجة عن النطاق المرجعي المعتمد في قواميس البيانات المؤسسية (Data Dictionaries)؛ إذ يمكن توظيفه للتحقق من أن القيم المدخلة في المتغيرات التصنيفية تنتمي حصراً إلى قائمة الرموز المقبولة نظامياً.
يتحقق ذلك من خلال صياغة استعلام عكسي يبحث عن السجلات التي لا تنتمي إلى الفئات المعيارية المعتمدة، كما يوضح الاستعلام التالي المكتوب بإجراء PROC SQL:
PROC SQL;
CREATE TABLE Quality_Control.Invalid_Entries AS
SELECT Record_ID, Category_Code, Entry_Date
FROM Clinical.Patient_Demographics
WHERE Category_Code NOT IN (‘CAT_A’, ‘CAT_B’, ‘CAT_C’, ‘CAT_D’);
QUIT;
يؤدي هذا الاستعلام إلى عزل كافة السجلات التي تحتوي على أخطاء إملائية، أو رموز قديمة ملغاة، أو مدخلات عشوائية لم يتم التحقق منها أثناء الإدخال. يمكن بعد ذلك أتمتة إرسال هذا الجدول الناتج إلى فرق إدارة الجودة والتحكم الإحصائي عبر تقارير تدقيق آلية تنبههم فوراً بوجود بيانات غير مطابقة تستدعي التصحيح أو الاستبعاد قبل اعتماد مجموعات البيانات في النماذج التحليلية المتقدمة.
10. الأخطاء الشائعة واستكشاف المشكلات وإصلاحها (Troubleshooting)
10.1 أخطاء التنسيق النحوي والرموز المفقودة
تعد الأخطاء النحوية والخلل في كتابة الرموز الهيكلية من أكثر العثرات شيوعاً عند كتابة معامل NOT IN، ولا سيما لدى المبرمجين الذين ينتقلون حديثاً إلى بيئة SAS من لغات برمجية أخرى. يتمثل الخطأ الأكثر تكراراً في نسيان حصر القيم النصية داخل علامات تنصيص فردية أو مزدوجة متطابقة، مما يجعل المترجم يتعامل مع تلك النصوص كأسماء متغيرات مجهولة، فيتوقف التنفيذ فوراً معلناً تعذر العثور على المتغير المزعوم.
كما يقع بعض المبرمجين في خطأ الخلط بين استخدام الفواصل العادية والمسافات البيضاء بطريقة غير منضبطة داخل القائمة، أو ترك فواصل زائدة في نهاية القائمة قبل إغلاق القوس مباشرة (مثل: NOT IN (1, 2, ))، وهو ما يفسره النظام كوجود وسيط مفقود غير مكتمل البنية، مما يتسبب في إطلاق تحذير نحوي صريح في سجل العمليات يعطل اكتمال خطوة المعالجة بنجاح.
تزداد الصعوبة عند التعامل مع سلاسل نصية تشتمل بنيتها الداخلية على علامات اقتباس، مثل الأسماء التي تحتوي على فاصلة عليا كاسم “O’Connor”. إذا حُصر هذا الاسم بين علامتي تنصيص مفردتين (‘O’Connor’)، فإن المترجم يعتبر العلامة الثانية نهاية النص، مما يحدث تشوهاً نحفياً جسيماً. يتطلب الحل البرمجي في هذه الحالة حصر النص بين علامتي تنصيص مزدوجتين (“O’Connor”) أو مضاعفة الفاصلة العليا الداخلية (‘O”Connor’) لتوجيه المترجم لتجاوزها والتعامل معها كجزء أصيل من القيمة النصية المستهدفة.
10.2 إساءة فهم أسبقية المعاملات المنطقية (Operator Precedence)
تمثل مسألة أسبقية المعاملات المنطقية أحد أخطر مصادر الأخطاء الخفية في بناء الشروط المركبة داخل SAS؛ حيث تخضع العمليات لترتيب تنفيذ جبري يبدأ بالمعاملات الحسابية، تليها معاملات المقارنة، ثم معامل النفي المنطقي NOT، يليه معامل العطف AND، ويأتي معامل الاختيار OR في المرتبة الأخيرة من سلم الأولويات ما لم يتم التدخل لتعديل هذا الترتيب يدوياً.
تتضح الكارثة المنطقية عند دمج معامل NOT IN مع معامل OR دون استخدام الأقواس الحاصرة لتحديد مسار التقييم بوضوح، كأن يكتب المبرمج الشرط التالي بهدف استبعاد فئات معينة وضمان تحقق حد أدنى للسن:
WHERE Age >= 18 AND Status NOT IN (‘Inactive’, ‘Pending’) OR Score > 90;
في هذا السياق، ونظراً لتقدم معامل AND في الأسبقية على OR، سيقوم المفسر بتقييم الجزء الأول معاً، ثم يقبل أي سجل يحقق الشرط الأخير (Score > 90) بصرف النظر تماماً عن سنه أو حالته، حتى لو كانت حالته مستبعدة صراحة! يترتب على ذلك دخول سجلات مستبعدة إلى النتيجة النهائية وتدمير الفرضية الاستبعادية بالكامل.
تقتضي الهندسة البرمجية المحكمة عزل الشروط التجميعية بصورة صريحة وقاطعة باستخدام الأقواس الدائرية لتوجيه مسار التقييم الداخلي وإلزام النظام باتباع منطق التحليل المقصود، كما في الصياغة الوقائية السليمة التالية:
WHERE (Age >= 18) AND (Status NOT IN (‘Inactive’, ‘Pending’)) AND (Score > 90);
يضمن هذا الأسلوب عزل كل مقارنة استبعادية في نطاقها الخاص ومنع أي تداخل غير مقصود في الأسبقيات المنطقية بين العمليات المختلفة.
10.3 تحليل وتفسير رسائل الخطأ والتحذير في سجل SAS
يمثل سجل SAS (SAS Log) الأداة الأكثر موثوقية لاستكشاف المشكلات وتشخيص الأعطال البرمجية المرتبطة بمعامل NOT IN. يُبرز السجل المشكلات عبر ثلاثة مستويات متدرجة: الملاحظات (NOTES)، والتحذيرات (WARNINGS)، والأخطاء الصريحة (ERRORS). يشير كل مستوى إلى درجة خطورة الحدث البرمجي وأثره على مخرجات التحليل.
تظهر رسائل الخطأ النحوي الشهيرة مثل “ERROR 22-322: Syntax error, expecting one of the following…” عندما يفشل المترجم في التعرف على بنية الجملة بسبب قوس مفقود، أو فاصلة غير صحيحة، أو تهجئة خاطئة للكلمات المفتاحية. يتميز محرك SAS بوضع خط تحتي أو إشارة محرفية ترشد المبرمج بدقة إلى الموقع الحرفي الذي تعثرت عنده عملية الترجمة، مما يسهل معالجة الخطأ المادي في الحال.
عند الشك في سلوك التصفية وعدم مطابقة النتائج للتوقعات رغم غياب أخطاء البنية التحتية، يُنصح بتوظيف أمر PUTLOG التتبعي داخل خطوة البيانات لطباعة قيم المتغيرات المعنية وتقييم الشرط في السجل مباشرة لكل ملاحظة أثناء التنفيذ الفعلي:
IF Status NOT IN (‘A’, ‘B’) THEN PUTLOG ‘Excluded Record: ‘ _N_= ID= Status=;
يتيح هذا الإجراء مراقبة الكيفية التي يرى بها النظام القيم المتدفقة في الوقت الحقيقي، وتحديد ما إذا كان الفشل المنطقي ناجماً عن مسافات خفية، أو قيم مفقودة، أو عدم تطابق في دقة الأرقام العشرية، مما يوفر مساراً منهجياً لعزل المشكلة وحلها خطوة بخطوة.
11. أفضل الممارسات البرمجية والتقنيات المتقدمة لتوسيع الكود
11.1 توليد قوائم الاستبعاد ديناميكياً عبر متغيرات الماكرو (Macro Variables)
تصل برمجة SAS إلى أقصى درجات المرونة والتكامل عند دمج معامل NOT IN مع منظومة الماكرو المتقدمة؛ حيث يتم التخلي عن كتابة عناصر القوائم يدوياً داخل الكود، والاعتماد بدلاً من ذلك على استخراجها ديناميكياً ومباشرة من جداول البيانات الوصفية أو التكوينية وحفظها في متغير ماكرو عام يُمرر تلقائياً إلى شرط الاستبعاد.
يتحقق هذا التكامل الاحترافي عبر استخدام إجراء PROC SQL المقترن بعبارة INTO :macro_variable مع استخدام الفاصلة كمحدد للفصل بين القيم المتتالية، كما يوضح النموذج البرمجي التالي:
PROC SQL NOPRINT;
SELECT QUOTE(STRIP(Excluded_Code), “‘”)
INTO :Exclude_List SEPARATED BY ‘, ‘
FROM Config.System_Exclusions
WHERE Exclude_Flag = 1;
QUIT;
تقوم هذه الخطوة بجمع كافة الرموز المستبعدة وتغليفها بعلامات تنصيص صريحة وفصلها بفواصل جاهزة، ثم يتم تمرير هذا المتغير إلى خطوة البيانات اللاحقة بسلاسة تامة عبر استدعائه بالرمز (&):
DATA Work.Clean_Data;
SET Source.Raw_Data;
WHERE Target_Code NOT IN (&Exclude_List);
RUN;
يتعين على المطور الانتباه لحدود السعة التخزينية لمتغيرات الماكرو في الذاكرة العشوائية؛ حيث تصل السعة القصوى لمتغير الماكرو الفردي في بيئات SAS الحديثة إلى 65,534 محرفاً. فإذا كانت قائمة الاستبعاد تتجاوز هذا الطول النصي الشاسع، فإن المنهجية تقتضي الابتعاد عن متغيرات الماكرو والتحول فوراً نحو استعلامات الربط الفرعية أو كائنات التجزئة Hash Objects لتفادي اقتطاع القائمة وانهيار البنية المنطقية للشرط.
11.2 كتابة شيفرات برمجية معيارية قابلة لإعادة الاستخدام والصيانة
تتطلب كتابة الأكواد البرمجية في المؤسسات البحثية والشركات المالية التزاماً صارماً بمبادئ التوحيد المعياري وهندسة البرمجيات القابلة لإعادة الاستخدام والصيانة السلسة على المدى الطويل من قِبل فرق عمل متعددة ومتباينة التخصصات.
تبدأ هذه الممارسات بالتوثيق الداخلي الموسع والشامل؛ إذ يجب إرفاق تعليقات برمجية واضحة ومفصلة بجوار كل استبعاد منطقي يوضح بالتفصيل: لماذا تم استبعاد هذه الفئات تحديداً؟ وما هو السند التنظيمي أو الإحصائي الذي استوجب إسقاطها من العينة؟ ومن هو المحلل أو الهيئة التي اعتمدت هذا القرار مع تاريخ التوثيق؟ يُجنب هذا الإجراء المؤسسة فقدان المعرفة الضمنية عند انتقال المطورين أو تحديث السياسات التحليلية.
كما يُنصح بشدة بفصل ثوابت الاستبعاد عن الأكواد التنفيذية؛ بحيث يتم تجميع القوائم والمعايير في ملفات إعداد وتكوين مستقلة أو جداول مرجعية مركزية، وتجنب “الترميز الثابت” (Hard-Coding) للأرقام والأسماء داخل عمق البرامج. يتيح هذا الفصل تحديث معايير التصفية وتوسيعها مستقبلاً بمجرد تعديل الجداول المرجعية دون الحاجة للمساس بالأكواد التشغيلية الحساسة، مما يرفع من أمان البيئة البرمجية ويقلل مخاطر الأعطال غير المتوقعة.
11.3 إجراءات الاختبار والتحقق القياسية قبل تشغيل الكود الموسع
يعد تطبيق الشروط الاستبعادية الموسعة مباشرة على قواعد البيانات الضخمة التي تحتوي على عشرات الملايين من القيود مخاطرة حوسبية غير مسؤولة؛ إذ قد تؤدي الأخطاء المنطقية غير المكتشفة إلى إهدار ساعات طويلة من زمن المعالجة واستنزاف غير مبرر لموارد الخوادم المركزية.
تقتضي الإجراءات القياسية لضبط الجودة اختبار الشروط أولاً على عينات فرعية صغيرة وممثلة للبيانات باستخدام خيار OBS=؛ حيث يتم سحب بضعة آلاف من السجلات لإجراء تدقيق يدوي وميكانيكي على النتائج، والتأكد من أن مسار التصفية يتطابق تماماً مع السيناريوهات التحليلية المفترضة.
تتكامل هذه المنهجية مع استدعاء إجراء الجداول التكرارية PROC FREQ لإجراء مسح شامل لتوزيع المتغيرات المستهدفة قبل تطبيق معامل الاستبعاد وبعده مباشرة، كما يوضح النموذج التحليلي التالي:
PROC FREQ DATA=Source.Raw_Data;
TABLES Exclusion_Variable / MISSING;
RUN;
تتيح مقارنة مخرجات هذا الفحص قبل التصفية وبعدها التأكد بما لا يدع مجالاً للشك من أن عدد السجلات التي تم استبعادها يطابق تماماً مجموع تكرارات الفئات المحددة في القائمة، والتأكد من خلو النتائج النهائية من أي تسرب غير مقصود للبيانات غير المرغوبة، مما يشكل خط الدفاع الأخير لاعتماد جودة البيانات قبل رفعها إلى البيئات الإنتاجية العليا.
12. الخلاصة الإرشادية والتوجيهات المستقبلية لمحللي البيانات
12.1 ملخص القواعد الأساسية للاستخدام الأمثل لمعامل NOT IN
يعد معامل NOT IN من الركائز التعبيرية فائقة الأهمية في منظومة برمجة SAS، حيث يجمع بين بساطة الصياغة النحوية والقوة الوظيفية في تنقية البيانات واستبعاد المجموعات غير المستهدفة. يتطلب الاستخدام الاحترافي لهذا المعامل إدراكاً عميقاً للفروق الجوهرية بين بيئات تنفيذه المتنوعة؛ فالاستخدام ضمن جملة WHERE في خطوة البيانات يوفر أعلى درجات الكفاءة عبر تصفية السجلات قبل دخولها للذاكرة المؤقتة، في حين يتيح استخدامه مع جملة IF مرونة فريدة في التعامل مع المتغيرات المشتقة ديناميكياً، بينما يقدم إجراء PROC SQL حلولاً استعلامية متقدمة تدعم التصفية الديناميكية بالاستعلامات الفرعية والتوافق مع المعايير الدولية لقواعد البيانات.
أبرزت الدراسة المتعمقة لهذا المعامل ضرورة الانتباه الصارم لخصائص أنواع البيانات؛ فالمتغيرات النصية تتطلب تحييداً منهجياً لحساسية حالة الأحرف عبر دوال مثل UPCASE وتطهيراً متقدماً من المسافات الزائدة بدالة STRIP لضمان نجاح المطابقة. وفي المقابل، تفرض المتغيرات العددية تجنب إدراج الأرقام الكسرية الحساسة لأخطاء النقاط العائمة إلا بعد تقريبها، والامتناع التام عن خلط الأنواع لتفادي التحذيرات التشغيلية والتباطؤ الحسابي الناجم عن التحويل الضمني بين المحارف والأرقام.
تظل إدارة القيم المفقودة القضية المركزية الأكثر حساسية في منطق الاستبعاد؛ فالقيم المفقودة في SAS تمتلك قيماً حسابية وترتيبية خاصة قد تؤدي إلى الاحتفاظ بها تلقائياً عند تطبيق معامل الاستبعاد، أو تعطيل الاستعلام بالكامل في بيئة SQL إذا اشتملت القائمة الفرعية على قيم فارغة. لذا فإن الممارسة الأكثر نضجاً ورصانة تقتضي دائماً عزل القيم المفقودة ومعالجتها عبر شروط صريحة ومستقلة، لضمان توافق العينة المستبقاة مع متطلبات النماذج الإحصائية والتحليلية المقررة.
12.2 قائمة تحقق سريعة (Checklist) للمبرمج قبل اعتماد التصفية
لمساعدة محللي ومطوري البيانات على تدقيق الشيفرات البرمجية قبل إطلاقها النهائي، تم تصميم قائمة التحقق المعيارية التالية التي تختزل أهم الضوابط الهندسية والمنطقية الواجب استيفاؤها:
- التطابق الصارم للأنواع: هل جميع عناصر قائمة الاستبعاد تطابق نوع المتغير المفحوص (نصوص صريحة بين علامات تنصيص، أو أرقام مجردة بدون تنصيص)؟
- تحييد حالة الأحرف والمسافات: هل تم تطبيق دوال توحيد النصوص مثل UPCASE وSTRIP لضمان عدم تأثر المعامل بحساسية الحروف والمسافات الخفية؟
- حصر الأسبقيات المنطقية: هل تم عزل شروط الاستبعاد المركبة بالأقواس الهلالية الصريحة لمنع تداخل أسبقيات AND وOR بطريقة تشوه النتيجة؟
- إدارة القيم المفقودة: هل تم تحديد مصير القيم المفقودة صراحة بالاعتماد على أدوات فحص مخصصة مثل دالة MISSING بدلاً من تركها للتقييم التلقائي؟
- معالجة النقاط العائمة: هل تم تقريب المتغيرات العددية الكسرية بدقة مناسبة لتفادي إخفاقات التمثيل الثنائي غير المرئية؟
- التحقق الكمي من السجل: هل تمت مراجعة سجل النظام (SAS Log) والتحقق من عدم وجود رسائل تحذير بشأن التحويل التلقائي، ومطابقة عدد السجلات المتبقية مع التوقعات الرياضية المسبقة؟
12.3 آفاق التوسع في إتقان تقنيات الاستعلام المتقدمة في SAS
يمثل إتقان معامل NOT IN محطة أولى وأساسية في مسار احتراف معالجة وتجهيز البيانات داخل منظومة SAS، تفتح آفاقاً رحبة للمحلل للانتقال نحو تقنيات استعلامية وتحليلية أكثر تطوراً وتخصصاً؛ حيث يُشكل الانتقال لدراسة عمليات الربط المعقدة وتوظيف معاملات الاستبعاد المتقدمة مثل NOT EXISTS في بيئات قواعد البيانات الكبرى خطوة محورية لرفع الكفاءة التحليلية إلى مستويات متقدمة.
كما تبرز دوال التعبير النمطي المتقدمة (Perl Regular Expressions – PRX Functions)، مثل دالة PRXPARSE ودالة PRXMATCH، كأدوات فائقة القوة تتيح للمحلل تجاوز حدود القوائم الثابتة لمعامل NOT IN نحو استبعاد الأنماط النصية المعقدة وغير المتجانسة، كاستبعاد هياكل بريد إلكتروني معينة أو صيغ رقمية محددة بناءً على نماذج محرفية ديناميكية يصعب حصرها في مصفوفات ثابتة.
تتكامل هذه المهارات المنطقية في الوقت الراهن مع التحول المتسارع نحو منصة التحليلات السحابية الحديثة منصة SAS Viya السحابية، وما تتيحه من محركات معالجة فائقة السرعة تعمل داخل الذاكرة المتوازية الموزعة (Cloud Analytic Services – CAS). إن الفهم العميق لكيفية ترجمة المعاملات المنطقية الكلاسيكية داخل بيئات الحوسبة المتوازية فائقة التوسع يمنح محلل البيانات ميزة تنافسية استثنائية، تمكنه من معالجة أعتى تدفقات البيانات الضخمة بدقة رياضية متناهية وأداء حوسبي عالي الكفاءة.
المراجع
Allison, P. D. (2012). Missing Data. SAGE Publications, Inc. https://doi.org/10.4135/9781412985079
Cody, R. (2018). Cody’s Data Cleaning Techniques Using SAS (3rd ed.). SAS Institute Inc.
Delwiche, L. D., & Slaughter, S. J. (2019). The Little SAS Book: A Primer (6th ed.). SAS Institute Inc.
IEEE. (2019). IEEE Standard for Floating-Point Arithmetic (IEEE Std 754-2019). IEEE. https://doi.org/10.1109/IEEESTD.2019.8766229
ISO/IEC. (2016). Information technology — Database languages — SQL — Part 2: Foundation (SQL/Foundation) (ISO/IEC 9075-2:2016). International Organization for Standardization. https://www.iso.org/standard/63555.html
SAS Institute Inc. (2020). SAS 9.4 Language Reference: Concepts (6th ed.). SAS Institute Inc. https://documentation.sas.com
SAS Institute Inc. (2021). Base SAS 9.4 Procedures Guide (Statistical Procedures, 5th ed.). SAS Institute Inc. https://documentation.sas.com
SAS Institute Inc. (2023). SAS SQL Procedure User’s Guide. SAS Institute Inc. https://documentation.sas.com
Stoltzfus, J. C. (2011). Logistic Regression: A Brief Primer. Academic Emergency Medicine, 18(10), 1099–1104. https://doi.org/10.1111/j.1553-2712.2011.01185.x