Удалить повторяющиеся строки в базе данных sql - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть таблица со следующими полями:

`contract`, `title`, `category`, `reglementation`, `company`, `role`, `start_date`, `end_date`, `creation_date`, `update_date`, `created_by`, `updated_by`,`context`,`hash`,`accept_schedule`,`need_timecard`

, и мне нужно удалить строки с тем же контрактом, а end_date имеет значение null, но с небольшим значением start_date

this запрос возвращает повторяющиеся строки, он возвращает 9000

select contract, count(*) 
from n_h_associate_occupation o 
where end_date is null 
group by o.contract 
having count(*) > 1;

есть ли способ удалить эти строки? Пожалуйста, помогите

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Если для каждого значения contract вы хотите избавиться от всех строк с наименьшими значениями start_date, то есть оставить только строку с максимальным значением start_date для тех строк, где end_date равно null, затем:

delete o from
n_h_associate_occupation o join
( 
select contract, max(start_date) as max_start_date
from n_h_associate_occupation
where end_date is null
group by contract
having count(*) > 1
) sq
on o.contract = sq.contract and o.end_date is null and o.start_date <> sq.max_start_date

См. Db Fiddle

Если вы хотите сохранить строку с наименьшим start_date (это не совсем понятно из вашего вопроса), тогда:

delete o from
n_h_associate_occupation o join
( 
select contract, min(start_date) as min_start_date
from n_h_associate_occupation
where end_date is null
group by contract
having count(*) > 1
) sq
on o.contract = sq.contract and o.end_date is null and o.start_date <> sq.min_start_date
0 голосов
/ 20 апреля 2020

Вот один вариант, который должен работать на всех версиях MySQL:

SELECT o1.*
FROM n_h_associate_occupation o1
INNER JOIN
(
    SELECT contract, MIN(start_date) AS min_start_date
    FROM n_h_associate_occupation
    WHERE end_date IS NULL
    GROUP BY contract
) o2
    ON o1.contract = o2.contract AND
       o1.start_date = o2.min_start_date
WHERE
    o1.end_date IS NULL;

Это предполагает, что вы хотите сохранить строки (строк) с наименьшей датой начала , если данный контракт имеет несколько строк.

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