Хранимая процедура для обновления строк в таблице, имеющих повторяющиеся значения в SQL Server - PullRequest
2 голосов
/ 02 мая 2019

У меня есть таблица active_user с 4 столбцами в базе данных SQL Server.Я хочу хранимую процедуру для очистки данных.

В данных, показанных ниже, я хочу обновить isActive до 0 для всех уникальных (firstName,lastName, isActive), где isActive = 1 и lastModified <<code>lastModified из (firstName, lastName, isActive) сгруппированных упорядоченныхDesc Top 1.

Пример данных перед выполнением хранимой процедуры:

firstName lastName  isActive  lastModified
-----------------------------------------------------
foo         bar        1       2019-11-16 06:43:19.77
foo         bar        1       2018-11-16 06:43:19.77
foo         bar        1       2017-11-16 06:43:19.77
foo         bar        1       2016-11-16 06:43:19.77
foo         bar        0       2015-11-16 06:43:19.77
foo         bar        0       2014-11-16 06:43:19.77
foo1        bar1       1       2019-11-16 06:43:19.77
foo1        bar1       1       2018-11-16 06:43:19.77
foo1        bar1       0       2017-11-16 06:43:19.77
foo2        bar2       1       2018-11-16 06:43:19.77
foo2        bar2       0       2017-11-16 06:43:19.77

Тот же набор данных после выполнения хранимой процедуры:

firstName lastName  isActive  lastModified
------------------------------------------------------
foo         bar        1       2019-11-16 06:43:19.77
foo         bar        0       2018-11-16 06:43:19.77 //updated
foo         bar        0       2017-11-16 06:43:19.77 //updated
foo         bar        0       2016-11-16 06:43:19.77 //updated
foo         bar        0       2015-11-16 06:43:19.77
foo         bar        0       2014-11-16 06:43:19.77
foo1        bar1       1       2019-11-16 06:43:19.77 
foo1        bar1       0       2018-11-16 06:43:19.77 //updated
foo1        bar1       0       2017-11-16 06:43:19.77 
foo2        bar2       1       2018-11-16 06:43:19.77
foo2        bar2       0       2017-11-16 06:43:19.77

Всего обновлено 4 строки.

Вот моя попытка псевдо SQL:

update active_user 
set isActive = 0 in (SELECT unique(firstName, lastName, isActive) 
where isActive = 1 
  and lastModified < (select TOP 1 distinct(firstName, lastName, isActive) 
                      where isActive = 1) 
group by (firstName, lastName, isActive) orderBy))

Я ищу способ решения этой проблемы, чтобы она могла быть выполнена элегантно.

Ответы [ 2 ]

3 голосов
/ 02 мая 2019

Вы можете сделать это в SQL Server, используя обновляемый CTE:

with toupdate as (
      select au.*,
             row_number() over (partition by first_name, last_name, isactive order by last_modified desc) as seqnum
      from active_user au
     )
update toupdate
    set isActive = 0
    where seqnum <> 1 and isActive = 1;
1 голос
/ 02 мая 2019

используйте row_number для идентификации строки с последним значением lastModified и установите в 1. Остальное в 0

; with cte as
(
    select *, rn = row_number() over (partition by firstName, lastName  
                                          order by lastModified desc)
    from   active_user
)
update c
set    isActive = case when rn = 1 then 1 else 0 end
from   cte c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...