Как использовать row_number () в SQL Server - PullRequest
4 голосов
/ 16 апреля 2011

Я хочу обновить данные строки, где row_number столбца (p_id) равен 1 .., но этот синтаксис выдает ошибку:

update app1 
set p_id = 1 
where Row_Number() = 1 over(p_id) 

Ответы [ 3 ]

7 голосов
/ 16 апреля 2011

Вы не можете использовать ROW_NUMBER() напрямую - вам нужно, например, используйте CTE (Common Table Expression) для этого:

;WITH DataToUpdate AS
(
    SELECT
       SomeID,
       p_id,
       ROW_NUMBER() OVER(ORDER BY .......) AS 'RowNum'
    FROM
       dbo.app1
)
UPDATE DataToUpdate
SET p_id = 1
WHERE 
   RowNum = 1

Чтобы использовать функцию ROW_NUMBER, вам также необходимо как минимум предложение ORDER BY, чтобы определить порядок, в котором упорядочиваются строки.

Из вашего вопроса не очень ясно, по каким критериям (столбцам) вы хотите заказать, чтобы определить свой ROW_NUMBER(), а также не ясно, какой тип столбца существует для уникальной идентификации строки (так что UPDATE можно применять)

1 голос
/ 16 апреля 2011

Это обновит только первого сотрудника этого возраста. Может использоваться в качестве логики типа лотереи

create table emp(name varchar(3),Age int, Salary int, IncentiveFlag bit)

insert into emp values('aaa',23,90000,0);
insert into emp values('bbb',22,50000,0);
insert into emp values('ccc',63,60000,0);
insert into emp values('ddd',53,50000,0);
insert into emp values('eee',23,80000,0);
insert into emp values('fff',53,50000,0);
insert into emp values('ggg',53,50000,0);

update A
set IncentiveFlag=1
from 
(
        Select row_number() over (partition by Age order by age ) AS SrNo,* from emp
)A
where A.SrNo=1
0 голосов
/ 03 декабря 2015

для удаления дубликатов; С CTE (имя, адрес1, телефон, RN) AS (ВЫБРАТЬ имя, адрес1, телефон, ROW_NUMBER () OVER (PARTITION по имени ORDER BY имя) как RN) УДАЛИТЬ ИЗ CTE, ГДЕ RN> 1

...