Обновить запрос оператора - PullRequest
1 голос
/ 26 января 2011

У меня есть таблица с именем status, в которой есть такие данные:

ID   Status  Number
1    S       1
1    p       2
1    S       3
1    C       4
2    S       5
2    R       6

Я хотел избавиться от дубликатов в этой таблице, поэтому я добавил еще один столбец в эту таблицу с именем Flag и установил для него 1 для всех записей. Теперь мой стол выглядит так:

ID   Status  Number  Flag
1    S       1       Y
1    p       2       Y
1    S       3       Y
1    C       4       Y
2    S       5       Y
2    R       6       Y

Я пишу запрос на обновление, чтобы обновить столбец флага до N, если в нем есть дубликаты, а запрос на обновление:

Столбец Number является идентификатором в таблице.

udate status
set flag = 'N'
where flag = 'Y' and Number in 
(select min(Number) from status
where id = 1
having count(*) >1)

Так что, если я сделаю этот запрос, он даст мне данные без дубликатов

Select status from status
where flag = Y

Но запрос на обновление не работает, если у меня есть 3 аналогичных значения для статуса. Обновление работает, только если у меня есть 2 аналогичных значения для статуса.

Может кто-нибудь предложить мне способ сделать это?

Ответы [ 2 ]

2 голосов
/ 26 января 2011

Используйте это, чтобы пометить только дубликаты (не затрагивая первое значение):

WITH    q AS
        (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY id, status ORDER BY number) AS rn
        FROM    status
        )
UPDATE  q
SET     flag = CASE rn WHEN 1 THEN 'Y' ELSE 'N' END

или это, чтобы отметить все значения, имеющие дубликаты:

WITH    q AS
        (
        SELECT  *, COUNT(*) OVER (PARTITION BY id, status) AS cnt
        FROM    status
        )
UPDATE  q
SET     flag = CASE cnt WHEN 1 THEN 'Y' ELSE 'N' END
0 голосов
/ 26 января 2011

Вы можете использовать row_number() для выбора первой строки определенного раздела:

update  t
set     flag = case when rn = 1 then 'Y' else 'N' end
from    (
        select  ROW_NUMBER() over (partition by status order by number) as rn
        ,       *
        from    @t
        ) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...