Найти дубликаты, используя номер посылки и обновив их статус. SQL Сервер 2014 - PullRequest
0 голосов
/ 20 февраля 2020

У меня проблема с дублирующимися записями в базе данных SQL Server 2014.

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

Форма, к сожалению, не имеет какого-либо вида проверки, чтобы гарантировать, что одна и та же посылка не будет отправлена ​​более одного раза , В настоящее время у меня нет контроля над веб-формой, и я не уверен, сколько времени потребуется ответственной команде для ее проверки.

Поэтому мне нужно придумать процедуру для деактивации дубликатов записей, и оставь только одну.

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

Когда веб-форма отправляется, она создает идентификатор записи в последовательном порядке и присваивает статус приложения «Зарегистрировано». Я думаю, что способ исправить это - принять самое высокое значение идентификатора записи за parcel, и это будет тот, который нужно сохранить, остальные должны быть деактивированы.

Деактивировать не самые последние записи, установив rec_status со значением «I». записи

Используемый мной запрос возвращает 4 столбца: Идентификатор записи, Номер посылки, Статус записи и Статус приложения

SELECT 
    B.[RECORD_ID], 
    B.[PARCEL_NBR], 
    B.[RECORD_STATUS],  -- The value of this column would be "I" for the duplicate records.
    B.[APPLICATION_STATUS]
FROM 
    A_TABLE A
INNER JOIN B_TABLE B 
    ON A.PARCEL_NBR = B.PARCEL_NBR
    AND (A.APPLICATION_STATUS IS NULL
    OR B.APPLICATION_STATUS = 'Registered');

Первоначальный вывод:

RECORD_ID   PARCEL_NBR      RECORD_STATUS   APPLICATION_STATUS
REC-00081   0608012098      A               Registered
REC-00082   0608012098      A               Registered
REC-00083   0608012098      A               Registered

Ожидается Вывод:

RECORD_ID   PARCEL_NBR      RECORD_STATUS   APPLICATION_STATUS
REC-00081   0608012098      I               Closed  - this record got updated
REC-00082   0608012098      I               Closed  - this record got updated
REC-00083   0608012098      A               Registered  

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

Ответы [ 2 ]

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

Вы можете использовать оконные функции и case logi c:

SELECT B.[RECORD_ID],  B.[PARCEL_NBR], 
       (CASE WHEN ROW_NUMBER() OVER (PARTITION BY B.PARCEL_NBR ORDER BY B.RECORD_ID DESC) > 1
             THEN 'I' ELSE B.[RECORD_STATUS]
         END) as RECORD_STATUS,
       (CASE WHEN ROW_NUMBER() OVER (PARTITION BY B.PARCEL_NBR ORDER BY B.RECORD_ID DESC) > 1
             THEN Closed  - this record got updated ELSE B.APPLICATION_STATUS
         END) as APPLICATION_STATUS,
    B.[]
FROM A_TABLE A JOIN
     B_TABLE B 
     ON A.PARCEL_NBR = B.PARCEL_NBR AND
       (A.APPLICATION_STATUS IS NULL OR B.APPLICATION_STATUS = 'Registered');
0 голосов
/ 20 февраля 2020

Я не уверен, какую роль в этом играет A_TABLE, но это может дать вам то, что вы хотите:

update B_TABLE
   set record_Status = 'I'
     , application_status = 'Closed  - this record got updated'
 where record_status = 'A'
   and application_status = 'Registered'
   and record_id <> (select max(record_id)
                       from B_TABLE b
                      where b.parcel_nbr = B_TABLE.parcel_nbr
                        and b.record_status = 'A'
                        and b.application_status = 'Registered');
...