برخورد با مقادیر تکراری در SQL می تواند یک کار دست و پا گیر باشد. اما نترسید، این راهنما اینجاست تا بار شما را کاهش دهد.
داده ها در همه اشکال و اشکال موجود هستند، اما رکوردهای تکراری بخش برجسته ای از هر قالب داده است. چه با دادههای مبتنی بر وب سر و کار داشته باشید و چه صرفاً در میان کامیونهایی از دادههای فروش پیمایش کنید، اگر مقادیر تکراری داشته باشید، تجزیه و تحلیل شما منحرف میشود.
آیا از SQL برای خرد کردن اعداد و انجام پرس و جوهای طولانی در پشته های داده خود استفاده می کنید؟ اگر بله، پس این راهنمای مدیریت نسخه های تکراری SQL برای شما بسیار لذت بخش خواهد بود.
در اینجا چند روش مختلف برای مدیریت موارد تکراری با استفاده از SQL وجود دارد.
1. شمارش موارد تکراری با استفاده از گروه بر اساس تابع
SQL یک زبان برنامه نویسی چند وجهی است که توابع مختلفی را برای ساده کردن محاسبات ارائه می دهد. اگر تجربه زیادی در مورد توابع تجمع در SQL دارید، ممکن است قبلاً با گروه بر اساس تابع و آنچه که می توان از آن استفاده کرد آشنا هستید.
گروه بر اساس تابع یکی از اساسی ترین دستورات SQL است که برای برخورد با چندین رکورد ایده آل است زیرا می توانید از توابع مجموع مختلف مانند مجموع، شمارش، میانگین و بسیاری دیگر در ارتباط با گروه بر اساس تابع برای رسیدن به یک متمایز استفاده کنید. ارزش ردیفی
بسته به سناریو، می توانید موارد تکراری را با گروه بر اساس تابع در یک ستون و چندین ستون پیدا کنید.
آ. موارد تکراری را در یک ستون بشمارید
فرض کنید جدول داده های زیر را با دو ستون دارید: ProductID و Orders.
شناسه محصول
سفارشات
10
10
10
12
12
12
12
14
14
47
47
برای یافتن شناسههای محصول تکراری، میتوانید از گروه بر اساس تابع و عبارت داشتن برای فیلتر کردن مقادیر جمعآوری شده به شرح زیر استفاده کنید:
select productid, count(productid) as Total_count
from sahil.product_dups
group by productid
having count(productid) > 1
order by productid;
مانند یک دستور SQL معمولی، باید با تعریف ستون هایی که می خواهید در نتیجه نهایی نمایش دهید شروع کنید. در این حالت می خواهیم تعداد مقادیر تکراری را در ستون ProductID نمایش دهیم.
در بخش اول، ستون ProductID را در دستور select تعریف کنید. تابع شمارش از مرجع ProductID پیروی می کند تا SQL هدف درخواست شما را درک کند.
سپس جدول منبع را با استفاده از عبارت from تعریف کنید. از آنجایی که count یک تابع تجمیع است، باید از گروه به تابع برای گروه بندی تمام مقادیر مشابه استفاده کنید.
به یاد داشته باشید، ایده این است که مقادیر تکراری را در ستون ProductID فهرست کنید. برای انجام این کار، باید تعداد و مقادیر نمایش داده شده بیش از یک بار در ستون را فیلتر کنید. بند دارای داده های جمع آوری شده را فیلتر می کند. می توانید از شرط، یعنی count(productid) >1 برای نمایش نتایج مورد نظر استفاده کنید.
در نهایت، ترتیب بر اساس بند، نتایج نهایی را به ترتیب صعودی مرتب می کند.
خروجی به صورت زیر است:
ب موارد تکراری را در چندین ستون بشمارید
هنگامی که می خواهید موارد تکراری را در چندین ستون بشمارید اما نمی خواهید چندین پرس و جو SQL بنویسید، می توانید کد بالا را با چند ترفند گسترش دهید. به عنوان مثال، اگر می خواهید ردیف های تکراری را در چندین ستون نمایش دهید، می توانید از کد زیر استفاده کنید:
select productid, orders, count(*) as Total_count
from sahil.product_dups
group by productid, orders
having count(productid) > 1
order by productid;
در خروجی متوجه خواهید شد که فقط دو ردیف نمایش داده می شود. هنگامی که پرس و جو را تغییر می دهید و مرجع هر دو ستون را در عبارت select اضافه می کنید، تعداد ردیف های منطبق با مقادیر تکراری را دریافت می کنید.
به جای تابع count(column)، باید تابع count(*) را ارسال کنید تا ردیف های تکراری دریافت کنید. تابع * در تمام ردیفها جابجا میشود و بهجای مقادیر تکراری منفرد به دنبال ردیفهای تکراری میگردد.
خروجی در زیر نشان داده شده است:
ردیف های مربوطه با شناسه محصول 14 و 47 نمایش داده می شوند زیرا مقادیر سفارش یکسان هستند.
2. پرچم گذاری موارد تکراری با تابع row_number().
در حالی که گروه by و داشتن ترکیب سادهترین راه برای یافتن و پرچمگذاری موارد تکراری در یک جدول است، یک راه جایگزین برای یافتن موارد تکراری با استفاده از تابع row_number () وجود دارد. تابع row_number() بخشی از دسته توابع پنجره SQL است و برای پردازش کارآمد پرس و جوهای شما ضروری است.
در اینجا نحوه پرچم گذاری موارد تکراری با استفاده از تابع row_number () آمده است:
select productid, orders,
row_number() over (partition by productid order by productid) as sno
from sahil.product_dups;
تابع row_number() از هر مقدار شناسه محصول عبور می کند و تعداد تکرارها را برای هر ID یکسان می کند. کلمه کلیدی پارتیشن مقادیر تکراری را جدا می کند و مقادیر را به ترتیب زمانی مانند 1، 2،3 و غیره اختصاص می دهد.
اگر از کلمه کلیدی پارتیشن استفاده نکنید، یک شماره سریال منحصر به فرد برای همه شناسه های محصول خواهید داشت که با هدف شما مطابقت ندارد.
ترتیب به بند در بخش پارتیشن هنگام تعریف ترتیب مرتب سازی کاربردی است. می توانید بین ترتیب صعودی (پیش فرض) و نزولی یکی را انتخاب کنید.
در نهایت، میتوانید یک نام مستعار به ستون اختصاص دهید تا بعداً (در صورت نیاز) فیلتر شود.
3. حذف ردیف های تکراری از یک جدول SQL
از آنجایی که مقادیر تکراری در یک جدول می تواند تحلیل شما را منحرف کند، حذف آنها در مرحله پاکسازی داده ها اغلب ضروری است. SQL زبان ارزشمندی است که راه هایی را برای ردیابی و حذف مقادیر تکراری به طور موثر ارائه می دهد.
آ. استفاده از کلمه کلیدی متمایز
کلمه کلیدی متمایز احتمالاً رایج ترین و پرکاربردترین تابع SQL برای حذف مقادیر تکراری در جدول است. شما می توانید موارد تکراری را از یک ستون یا حتی ردیف های تکراری را در یک حرکت حذف کنید.
در اینجا نحوه حذف موارد تکراری از یک ستون آمده است:
select distinct productid from sahil.product_dups;
خروجی فهرستی از تمام شناسه های محصول منحصر به فرد را از جدول برمی گرداند.
برای حذف ردیف های تکراری، می توانید کد بالا را به صورت زیر تغییر دهید:
select distinct * from sahil.product_dups;
خروجی لیستی از تمام ردیف های منحصر به فرد جدول را برمی گرداند. با نگاهی به خروجی، متوجه خواهید شد که شناسه های محصول 14 و 47 تنها یک بار در جدول نتیجه نهایی ظاهر می شوند.
ب با استفاده از روش Common Table Expression (CTE).
روش Common Table Expression (CTE) کمی با کد اصلی SQL متفاوت است. CTEها شبیه جداول موقت SQL هستند، تنها تفاوت آنها مجازی بودن آنهاست که می توانید فقط در حین اجرای پرس و جو به آنها ارجاع دهید.
بزرگترین مزیت این است که شما مجبور نیستید یک پرس و جو جداگانه ارسال کنید تا بعداً این جداول حذف شوند، زیرا به محض اجرای پرس و جو دیگر وجود ندارند. با استفاده از روش CTE می توانید از کد زیر برای یافتن و حذف موارد تکراری استفاده کنید.
with cteproducts as
(select productid, orders,
row_number() over (partition by productid order by productid) as sno
from sahil.product_dups)
select * from cteproducts
where sno = 1;
می توانید تابع CTE را با استفاده از کلمه کلیدی with فراخوانی کنید. نام جدول مجازی موقت را بعد از کلمه کلیدی with تعریف کنید. مرجع جدول CTE هنگام فیلتر کردن مقادیر جدول مفید است.
در قسمت بعدی، با استفاده از تابع row_number () شماره ردیف را به شناسه محصولات خود اختصاص دهید. از آنجایی که شما به هر شناسه محصول با یک تابع پارتیشن ارجاع می دهید، هر شناسه تکرار شونده دارای یک مقدار متمایز است.
در نهایت، ستون sno جدید ایجاد شده را در آخرین بخش با دستور انتخاب دیگری فیلتر کنید. برای بدست آوردن مقادیر منحصر به فرد در خروجی نهایی، این فیلتر را روی 1 تنظیم کنید.
آموزش استفاده از SQL به روش آسان
SQL و انواع آن با توانایی ذاتی خود در پرس و جو و استفاده از پایگاه داده های رابطه ای تبدیل به موضوع مورد بحث شده اند. این زبان از نوشتن پرس و جوهای ساده گرفته تا انجام تحلیل های دقیق با پرس و جوهای فرعی، اندکی از همه چیز را دارد.
با این حال، قبل از نوشتن هر سؤالی، باید مهارت های خود را تقویت کنید و کدها را شکست دهید تا خود را به یک کدنویس ماهر تبدیل کنید. با پیاده سازی دانش خود در بازی ها می توانید SQL را به روشی سرگرم کننده یاد بگیرید. با اضافه کردن کمی سرگرم کننده به کد خود، برخی از تفاوت های ظریف کدنویسی را بیاموزید.