תרגיל 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. פיתרון
התרגיל הזה היה נראה לי ממש פשוט בקריאה ראשונה אבל אחרי זה כשהתחלתי לכתוב את הקוד זה הסתבך, אני לא יודע אם הבעיה היא אני או 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);