روش های پر کردن مقادیر NULL با استفاده از مقادیر موجود در رکوردهای قبلی

در این مقاله قراره به بررسی روش هایی برای پر کردن NULL های موجود با استفاده از مقادیر پیشین بپردازیم. داده هایی مثل موجودی یا لاگ ها و حتی خروجی های crawl که گپ هایی رو بوجود می آورند. که یکی از دلایل ایجاد این موضوع، میتونه مشابه بودن مقادیر با مقادیر پیشین باشه. و البته در محاسبات و حتی ایجاد روند ( trend) هم محدودیت ایجاد می کنند. به منظور شرح بهتر مساله به تصویر قبل و بعد تغییرات آورده شده در زیر دقت کنید:

و اما بریم سراغ راه حل ها! در این مقاله به بررسی 3 روش می پردازیم که به ترتیب روش بعدی از روش قبلی performance بهتری داره. اگر برای حجم داده زیاد می خواهید این کار رو انجام بدید که بهتره از روش سوم استفاده کنید البته باز با توجه به نوع داده تست هم داشته باشید.

داده های مثال:

 

روش اول: استفاده از SUBQUERY

در این روش با استفاده از subquery مقدار top 1 مقداری که از تاریخ و شناسه اون سطر کوچکتر باشه رو پیدا می کنیم و برای هر سطر باز میگردونیم. البته این کار رو فقط برای مقادیر NULL انجام میدیم. کد نهایی به صورت زیر:

در قسمت subquery همونطور که گفته شد اولین مقدار غیر NULL رو که کوچکتر از تاریخ اون رکورد و مطابق id رکورد باشه برمی گردونیم. و دقت کنید که آخرین مقدار برای اون شناسه و تاریخ در این مثال مد نظره برای همین داده ها به صورت نزولی بر روی تاریخ (DESC) مرتب می شوند.

روش دوم: استفاده از OUTERAPPLY

البته اگر با apply ها آشنا باشید احتمالا حدس زدید که کوئری بالا رو هم با apply هم میشه انجام داد. تفاوت چندانی از نظر script در این دو روش وجود نداره به غیر از این که در روش قبل از CASE برای پیدا کردن NULL ها استفاده می شد اما در این روش تنها مقدار تاریخ رو به جای کوچکتر به صورت کوچکتر مساوی می نویسیم. کد نهایی به صورت زیر:

روش سوم: استفاده از WINDOW FUNCTIONS

و اما روش آخر که کد پیچیده تری در ظاهر داره ولی از طرفی سرعت بهتری هم داره. در این روش ابتدا تعداد همه مقادیر (که NULL هم نیستند) رو میشمریم. یعنی به هر سطری که رسیدیم برای هر id مشخص می کنیم چه تعداد مقدار غیر NULL وجود داره. برای این که واضح تر بشه همه id های مثال رو به یک تبدیل می کنم تا دقیق تر بتونیم بررسیش کنیم.

با توجه به تصویر بالا برای id شماره 1 چهار عدد غیر NULL داریم.به طور مثال در id شماره 1 مقدار 200، عدد دوم هستش. از این ستون جدید به منظور گروه بندی استفاده می کنیم. این گروه بندی نیز برای بدست آوردن بیشترین مقدار در گروه استفاده می شود. در حقیقت به این صورت اولین مقدار غیر NULL و به تمام مقادیر NULL بعدش یه کد دادیم.

و اما کد نهایی به صورت زیر خواهد بود:

 

 

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

Fill out this field
Fill out this field
لطفاً یک نشانی ایمیل معتبر بنویسید.

فهرست