SQL запрос на удаление неверных записей из базы данных со столбцом даты в качестве критерия принятия решения - PullRequest
0 голосов
/ 02 марта 2020

Из-за неправильных вставок у меня есть несколько неправильных записей в базе данных. Это происходит в группах по четыре. Примеры:

ID_A  Startdate     Enddate      ID_B
296   05.09.2013    28.10.2017   62
296   05.09.2013    01.01.2999   62
296   28.10.2017    05.09.2013   65
296   28.10.2017    01.01.2999   65

285   26.02.2016    07.09.2018   93
285   26.02.2016    01.01.2999   93
285   07.09.2018    26.02.2016   58
285   07.09.2018    01.01.2999   58

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

Delete from table where ID_A = 296 and Enddate < Startdate

Но по второй строке пока понятия не имею. Мой желаемый результат - сделать две верные записи из верхних четырех строк:

ID_A  Startdate     Enddate      ID_B
296   05.09.2013    28.10.2017   62
296   28.10.2017    01.01.2999   65

285   26.02.2016    07.09.2018   93
285   07.09.2018    01.01.2999   58

У кого-нибудь есть идеи, как мне go узнать об этом?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Я думаю, что вы можете сделать:

delete from t
    where not exists (select 1
                      from t t2
                      where t2.startdate = t.enddate
                     ) and
          exists (select 1
                  from t t2
                  where t2.startdate < t.startdate or
                        (t2.startdate = t.startdate and t2.enddate < t.enddate)
                 );

Здесь - это дБ <> скрипка.

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

1 голос
/ 02 марта 2020

Вы можете попробовать ниже -

Delete from table t1
where exists (select 1
              from table t2
              where t1.ID_A = t2.ID_A
              and t1.Startdate = t2.Startdate
              and t1.ID_B = t2.ID_B
              and t1.Enddate > t2.Enddate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...