Как удалить повторяющиеся записи в таблице SQL на основе определенных условий и нескольких критериев?

Следующая таблица состоит из столбцов EmployeeID, JobNum, CompDate. По сути, есть 3 разных сотрудника, у которых есть определенные идентификаторы работы и их завершенная дата, связанная с ними. Есть некоторые jobNum, которые не связаны с конкретным EmployeeID и могут иметь полную дату.

Проблема: 1) Удалите записи для EmployeeID, если дата завершения не равна нулю или заполнена датой.

2) Удалите запись, которая имеет нулевые значения для обоих столбцов JobNum и CompDate для сотрудника, ЕСЛИ существует запись для этого EmployeeID, которая состоит из открытой работы (когда JobNum НЕ NULL, а CompDate имеет значение NULL). ЭТО ДЛЯ Дубликатов.

Пытался использовать функцию ранжирования с операторами case. Не ранжируется должным образом.

       [JobNum],       
       [CompDate], 
       RANK ( ) OVER( PARTITION BY [EmployeeID] ORDER BY 
        CASE WHEN ([JobNum] is null AND [CompDate] is null) THEN 1 
         WHEN ([JobNum] is not null AND [CompDate] is null) THEN 2
         WHEN ([JobNum] is not null AND [CompDate] is not null) THEN 3 
            END ASC) as Rank
  FROM [dbo].test1
  WHERE [EmployeeID] IN (SELECT [EmployeeID] FROM dbo.test1
            GROUP BY [EmployeeID]
            HAVING COUNT(*) > 1) 
EmployeeID    JobNum          CompDate                    Rank
   1             NULL            NULL                      1
   1             401             NULL                      2
   1             435             NULL                      2
   1             358       2019-07-15 15:10:57.810         4
   2             285             NULL                      1
   2             299       2019-07-15 15:14:04.603         2
   2             305       2019-07-14 15:10:57.810         2
   2             330       2019-06-13 10:10:30.710         2
   3             NULL           NULL                       1
   3             435            NULL                       2
   3             402       2019-07-11 13:10:47.610         3
Ex:    

                EmployeeID    JobNum          CompDate                    Rank
Delete this ->       1           NULL            NULL                      1
when this exists ->  1           401             NULL                      2
when this exists ->  1           435             NULL                      2
                     1           358       2019-07-15 15:10:57.810         4


person gisewok    schedule 15.07.2019    source источник
comment
Условие (2) действительно сложно обработать, и ваши данные, похоже, не имеют дубликатов. Можете внести ясность?   -  person Gordon Linoff    schedule 15.07.2019
comment
Привет, Гордон, значит, к одному EmployeeID привязано несколько вакансий. Я хочу иметь возможность удалять запись, которая имеет нулевые значения как для JobNum, так и для CompDate для этого конкретного EmployeeID, когда существует запись, в которой JobNum не равен нулю, но CompDate имеет значение null. Пример:   -  person gisewok    schedule 15.07.2019


Ответы (1)


Кажется, вам нужны только строки, где compdate имеет значение null и одно из следующих двух условий:

  • jobnum равно нулю
  • jobnum не является нулевым, и ни одна строка для сотрудника не имеет jobnum как нулевой

Я не уверен, какое отношение rank() имеет к этим условиям фильтрации:

select t.*
from test1 t
where t.compdate is not null and  -- condition 1
      (t.jobnum is null or
       not exists (select 1
                   from test1 tt
                   where tt.employeeid = t.employeeid and 
                         tt.compdate is null and
                         tt.jobnum is null
                  )
      );
person Gordon Linoff    schedule 15.07.2019
comment
Я собирался использовать функцию ранжирования, чтобы ранжировать их по идентификатору сотрудника и удалить записи, которые будут использоваться в хранимой процедуре. Я попробую. Спасибо! - person gisewok; 15.07.2019