powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Удаление дублей с условием
6 сообщений из 6, страница 1 из 1
Удаление дублей с условием
    #38991775
Подскажите грамотное решение.

Имеется таблица:
Id
article (артикул)
price (цена)

В таблице присутствуют строки с одинаковыми артикулами.
Задача: Оставить в таблице по одному уникальному артикулу с наименьшим значением цены.
...
Рейтинг: 0 / 0
Удаление дублей с условием
    #38991867
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разовая работа:
Создай новую таблицу.
Скопируй туда только нужные данные из старой.
Очисти старую.
Скопируй все из новой в старую.
Убей старую.


Правильное решение:
Добавь в таблицу поля типа "хорошая/плохая запись" и/или "хорошая запись в период от даты до даты".
И меняй эти флаги как нужно. Получишь и возможность убирать "плохие" записи и просто прятать их, и полную историю цен.
...
Рейтинг: 0 / 0
Удаление дублей с условием
    #38991869
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но вообще этот вопрос к теме форума не относится.
Такие вопросы надо задавать тут: http://www.sql.ru/forum/db-design
...
Рейтинг: 0 / 0
Удаление дублей с условием
    #38991885
Это не разовый алгоритм. В данный момент реализовал решение с использованием дополнительной temporary-таблицы, но чувствую что это ужасные костыли.
Есть мысли о сортировке по 2 параметрам - артикул и цена по возрастанию, а затем удаление всех строк с одинаковым артикулом, кроме первой(меньшей в результате сортировки), но вот оформить в виде запроса пока не получается.

Если ошибся разделом - прошу перенести в более подходящий.
...
Рейтинг: 0 / 0
Удаление дублей с условием
    #38991921
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение в 2 запроса (в один объединять не рискну):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
-- первый запрос оставляет в каждой группе 
-- по артикулу записи с минимальной ценой
-- (A - артикул, P - price)
DELETE FROM T
WHERE ID NOT IN (
  SELECT T2.ID
  FROM
    (
      SELECT A, MIN(P) AS M
      FROM T
      GROUP BY A
    ) AS T1
    LEFT JOIN T AS T2
      ON T2.P = T1.M AND T2.A = T1.A
);

-- затем применяется второй запрос, который оставляет 
-- записи с минимальным id в группе. Он полностью аналогичен 
-- первому, если P заменить на ID
...
Рейтинг: 0 / 0
Удаление дублей с условием
    #38991995
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя нет, рискну:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
DELETE FROM T
WHERE ID NOT IN (
  SELECT T2.MIND
  FROM 
    (
      -- минимальная цена для каждого артикула:
      SELECT MIN(P) AS MINP, A
      FROM T
      GROUP BY A
    ) AS T1
    LEFT JOIN
    (
      -- минимальный идентификатор для каждой пары артикул-цена:
      SELECT MIN(ID) AS MIND, A, P
      FROM T
      GROUP BY A || P -- или аналогичное условие для формирования пары
    ) AS T2
    ON 
      -- присоединить минимальный идентификатор для пар артикул-цена, 
      -- к минимальной цене для каждого артикула
      T2.A = T1.A AND 
      T2.P = T1.MINP);



Модератор: Тема перенесена из форума "SQLite".
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Удаление дублей с условием
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]