Member 13934644 Ответов: 2

Удаление перекрывающихся записей дат в таблице, основанной на 2 столбцах


Удаление перекрывающихся записей дат в таблице, основанной на 2 Столбцах

Ниже моя таблица

ИДЕНТИФИКАЦИОННЫЙ КОД EMP_ID ГРУППЫ ДАТА НАЧАЛА ДАТА ОКОНЧАНИЯ
01 0001 Team1 07/13/2018 01/01/3000
02 0001 Team2 06/01/2017 01/01/3000
03 0001 Team1 07/21/2018 01/01/3000
04 0001 Team2 08.07.2018 01/01/3000

Я хочу удалить перекрывающиеся записи дат:
03 0001 Team1 07/21/2018 01/01/3000
04 0001 Team2 08.07.2018 01/01/3000

Так как для Team1 диапазон дат 07/21/2018-01/01/3000 уже содержится в 07/13/2018-01/01/3000.
А для Team2 диапазон дат 08/07/2018-01/01/3000 уже содержится в 6/01/2017-01/01/3000.

Требуется срочная помощь и внимание...

Заранее спасибо!

Что я уже пробовал:

Третьей партийной системы состоит в добавлении дубликатов в БД

Member 13934643

Спасибо за оперативный ответ! Нет, я просто хочу сохранить самую раннюю дату. 01/01/3000 считается концом времени. Так что дата окончания действительно не имеет значения. Может быть много перекрывающихся записей (дубликатов); сохраняйте самую старую начальную дату. Я считаю, что нам нужно просто манипулировать первым запросом. Еще раз спасибо!

2 Ответов

Рейтинг:
1

Mohibur Rashid

Достижение этого с помощью простого запроса будет трудной задачей. Правила не очень понятны. Согласно вашим данным, конечная дата кажется одинаковой, но начальная дата отличается, и вы хотите сохранить только большую дату. Сколько там будет дубликатов? Только двое?

В любом случае,

-- you have all same end date with min start date; may be the query is not exactly right according to your final need
SELECT ID, EMP_ID, TEAM, [END DATE], MIN([START DATE]) [START DATE] FROM my_table GROUP BY ID, EMP_ID, END_DATE;

-- what would happen if start date is same end date is different? let's pick the big date
SELECT ID, EMP_ID, [START DATE], MAX(END DATE) FROM  (SELECT ID, EMP_ID, TEAM, [END DATE], MIN([START DATE]) [START DATE] FROM my_table GROUP BY ID, EMP_ID, END_DATE ) a GROUP BY ID, EMP_ID, [START DATE]

-- Now we are done with similar end date and similar start date
-- At this point I will write a function or take help of another tool, perhaps, Another programming language. 


Рейтинг:
0

Richard Deeming

Если я правильно понял ваши требования, то что-то вроде этого должно сработать:

DELETE
FROM
    D
FROM
    my_table As D
WHERE
    Exists
    (
        SELECT 1
        FROM my_table As O
        WHERE O.TEAM = D.TEAM
        And O.[END DATE] > D.[START DATE]
        And 
        (
            O.[START DATE] < D.[START DATE] 
        Or 
            -- If tied on start date, keep the one with the earlier ID:
            (O.[START DATE] = D.[START DATE] And O.ID < D.ID)
        )
    )
;