2016-02-15 2 views
1

mysql - Как я могу удалить строки с повторяющимися значениями 'row_id', но разными значениями 'recd_date' в одной таблице, оставив только строку с самым последним'recd_date '?Как удалить строки (строки) с повторяющимися значениями row_id, но разные значения полей даты в одной таблице?

Пробовал ниже сценарий ...

DELETE FROM table1 
WHERE table1.id = table1.id 
AND table1.recd_date < table1.recd_date; 

... но она удаляет все записи в таблице, которая по логике вещей, я могу понять. Но я чувствую, что должно быть довольно простое и прямое решение.

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

пример существующих данных таблицы

doc_id recd_date recd_amount update_date 
    72 2015-01-01  6000 2015-04-30 
    72 2015-01-01  6000 2015-02-30 
    12 2013-02-01  5000 2015-08-31 
    12 2013-02-01  5000 2014-08-31 
    12 2013-02-01  5000 2013-06-30 

пример желаемого результата

doc_id recd_date recd_amount update_date 
    72 2015-01-01  6000 2015-04-30 
    12 2013-02-01  5000 2015-08-31 
+0

неправильный код в последнем правлении. – pbnyc

+0

Действительно ли это необходимо для двух столбцов? Я думаю, что мой вопрос довольно понятен. – pbnyc

+0

имеет проблемы с созданием таблицы здесь. – pbnyc

ответ

1
DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(doc_id INT NOT NULL 
,recd_date DATE NOT NULL 
,recd_amount INT NOT NULL 
,update_date DATE NOT NULL 
,PRIMARY KEY(doc_id,update_date) 
); 

INSERT INTO my_table VALUES 
(72,'2015-01-01',6000,'2015-04-30'), 
(72,'2015-01-01',6000,'2015-02-28'), 
(12,'2013-02-01',5000,'2015-08-31'), 
(12,'2013-02-01',5000,'2014-08-31'), 
(12,'2013-02-01',5000,'2013-06-30'); 

SELECT * 
    FROM my_table x 
    LEFT 
    JOIN 
    (SELECT doc_id 
      , MAX(update_date) max_update_date 
     FROM my_table 
     GROUP 
      BY doc_id 
    ) y 
    ON y.doc_id = x.doc_id 
    AND y.max_update_date = x.update_date; 

+--------+------------+-------------+-------------+--------+-----------------+ 
| doc_id | recd_date | recd_amount | update_date | doc_id | max_update_date | 
+--------+------------+-------------+-------------+--------+-----------------+ 
|  12 | 2013-02-01 |  5000 | 2013-06-30 | NULL | NULL   | 
|  12 | 2013-02-01 |  5000 | 2014-08-31 | NULL | NULL   | 
|  12 | 2013-02-01 |  5000 | 2015-08-31 |  12 | 2015-08-31  | 
|  72 | 2015-01-01 |  6000 | 2015-02-28 | NULL | NULL   | 
|  72 | 2015-01-01 |  6000 | 2015-04-30 |  72 | 2015-04-30  | 
+--------+------------+-------------+-------------+--------+-----------------+ 

DELETE x 
    FROM my_table x 
    LEFT 
    JOIN 
    (SELECT doc_id 
      , MAX(update_date) max_update_date 
     FROM my_table 
     GROUP 
      BY doc_id 
    ) y 
    ON y.doc_id = x.doc_id 
    AND y.max_update_date = x.update_date 
WHERE y.doc_id IS NULL; 
Query OK, 3 rows affected (0.00 sec) 

SELECT * FROM my_table; 
+--------+------------+-------------+-------------+ 
| doc_id | recd_date | recd_amount | update_date | 
+--------+------------+-------------+-------------+ 
|  12 | 2013-02-01 |  5000 | 2015-08-31 | 
|  72 | 2015-01-01 |  6000 | 2015-04-30 | 
+--------+------------+-------------+-------------+ 

http://sqlfiddle.com/#!9/fca88/1

+0

doc id должен быть VARCHAR; это имеет значение? Я попытался правильно поместить его в «пример» в редактировании кода, но перепутался. Doc id имеет буквы и цифры. – pbnyc

+0

Я могу создать первичный ключ, если есть дубликаты? Или вы предполагаете, что это решение для устранения дубликатов при загрузке? – pbnyc

+0

Я не думаю, что это (INT/VARCHAR), просто чтобы уточнить детали. Не уверен, что вы имеете в виду, почему это имеет значение во второй части моего вопроса. – pbnyc

Смежные вопросы