תרגיל SQL - מחיקת שורות כפולות

16/09/2024

נתונה טבלה עם פריטים שנוצרה על ידי הפקודה:

create table items(id integer primary key, name text);

INSERT INTO items (name) VALUES
    ('Item A'),
    ('Item B'),
    ('Item C'),
    ('Item A'),
    ('Item D'),
    ('Item E'),
    ('Item B'),
    ('Item F'),
    ('Item G'),
    ('Item A'); 

מחקו את כל השורות הכפולות, כלומר השאירו מקסימום שורה אחת לכל שם של פריט.

תוכן עניינים

  1. פיתרון

1. פיתרון

התרגיל הזה היה נראה לי ממש פשוט בקריאה ראשונה אבל אחרי זה כשהתחלתי לכתוב את הקוד זה הסתבך, אני לא יודע אם הבעיה היא אני או SQL אז מפרסם כאן עם הפיתרון שלי. אם יש לכם כיוונים פשוטים יותר אל תתביישו לשתף.

התחלתי את הפיתרון עם row_number ו partition וככה אפשר לראות בקלות ערכים כפולים - אלה שה row_number אצלכם גדול מ-1:

select
    id,
    name,
    row_number() over (partition by name) as rn
from items

עכשיו בשביל להציג רק את המזהים של השורות הכפולות צריך להשתמש ב rn בתוך תנאי where, וזה דורש הגדרת CTE. סך הכל כך אני מציג את השורות הכפולות בלבד (מלבד הראשונה):

with items_rn as (
  select
    id,  
    name,
    row_number() over (partition by name) as rn
  from items)
select id from items_rn where rn > 1

ואפילו זה לא הסוף כי בשביל למחוק אותן צריך להשתמש בכל הבלוק הזה בתור sub query, מה שמביא אותנו ל:

delete from items where id in

(with items_rn as (
  select
    id,
    name,
    row_number() over (partition by name) as rn
  from items)
select id from items_rn where rn > 1);