Удалите дубликаты, сохраняя только самые дешевые цены - PullRequest
2 голосов
/ 08 апреля 2019

Я работаю над каталогом продуктов (электронной коммерцией), который хранится в базе данных PostgreSQL.У меня в настоящее время есть дубликаты.Я хотел бы удалить эти дублированные продукты, оставив только самый дешевый.

Поля в базе данных, которые важны:

ID [PK]   SKU   EAN    Price    ....
1         SKU1  123    45.0     ....
2         SKU2  456    36.0     ....
3         SKU3  123    40.0     ....
4         SKU4  789    58.0     ....
5         SKU5  123    38.0     ....
...

У меня есть СЕРИЙНЫЙ ПЕРВИЧНЫЙ КЛЮЧ на ИД поля.У меня есть SKU NOT NULL, код NOT NULL EAN-13 и цена NOT NULL для каждого продукта.

Мы видим, что EAN "123" дублируется несколько раз.Я хотел бы найти запрос SQL, который удаляет все дубликаты (все строки), оставляя только ОДИН, который будет иметь самую низкую цену.

У нас будет:

ID [PK]   SKU   EAN    Price    ....
2         SKU2  456    36.0     ....
4         SKU4  789    58.0     ....
5         SKU5  123    38.0     ....
...

Длязнать: количество дубликатов может быть переменным.Вот пример с 3 продуктами с одинаковым EAN, но у нас может быть 2, 4, 8 или 587 ...

До сих пор мне удавалось удалить дубликаты с самым низким или самым большим идентификатором втолько 2 дубликата, но это не то, что я пытаюсь найти ...

    FROM 
        (SELECT Price,
         MIN(Price) OVER( PARTITION BY ean ORDER BY  Price DESC ) AS row_num FROM TABLE ) t
        WHERE t.row_num > 1 );

Ответы [ 3 ]

0 голосов
/ 09 апреля 2019

Я бы сделал это, используя коррелированный подзапрос:

delete from mytable t
where t.price > (select min(t2.price) from mytable t2 where t2.sku = t.sku);
0 голосов
/ 11 апреля 2019

Полагаю, я искал слишком сложные вещи!Спасибо, ребята:)

0 голосов
/ 08 апреля 2019

Вот одно решение, которое использует синтаксис Postgres DELETE ... USING:

DELETE 
FROM mytable t1
USING mytable t2
WHERE t1.sku = t2.sku AND t1.price > t2.price

При этом удаляются записи с дубликатами sku с, при этом сохраняется запись с наименьшим price.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...