在sql server 2008中使用自定义行号开始行号



我想设置一个名为'vorder'的列,根据行号跳过一些唯一的id。

Table "tblUser" like:

╔════════╦═══════════╦══════════╦══════════╦════════╗
║     Id ║ Firstname ║ Lastname ║ Birthday ║ Salary ║
╠════════╬═══════════╬══════════╬══════════╬════════╣
║      1 ║ kinjal    ║ a        ║        1 ║    122 ║
║      2 ║ a         ║ s        ║        4 ║    122 ║
║      5 ║ b         ║ ds       ║       12 ║    234 ║
╚════════╩═══════════╩══════════╩══════════╩════════╝

现在,我想根据Id降序更新Id不为1的跳过Birthday。

我想要的结果是

╔════════╦═══════════╦══════════╦══════════╦════════╗
║     Id ║ Firstname ║ Lastname ║ Birthday ║ Salary ║
╠════════╬═══════════╬══════════╬══════════╬════════╣
║      1 ║ kinjal    ║ a        ║        1 ║    122 ║
║      2 ║ a         ║ s        ║        3 ║    122 ║
║      5 ║ b         ║ ds       ║        2 ║    234 ║
╚════════╩═══════════╩══════════╩══════════╩════════╝

但是我有以下查询

WITH CTE_USER(ID, FIRSTNAME, LASTNAME, BIRTHDAY, SALARY, ROW_NUM) 
 AS (SELECT *, 
            ROW_NUMBER() 
              OVER ( 
                ORDER BY ID DESC) AS row_num 
     FROM   TBLUSER 
     WHERE  ID <> 1) 
UPDATE TBLUSER 
SET    BIRTHDAY = CTE_USER.ROW_NUM 
FROM   TBLUSER 
       INNER JOIN CTE_USER 
               ON TBLUSER.ID = CTE_USER.ID 

结果是:

╔════════╦═══════════╦══════════╦══════════╦════════╗
║     Id ║ Firstname ║ Lastname ║ Birthday ║ Salary ║
╠════════╬═══════════╬══════════╬══════════╬════════╣
║      1 ║ kinjal    ║ a        ║        1 ║    122 ║
║      2 ║ a         ║ s        ║        3 ║    122 ║
║      5 ║ b         ║ ds       ║        1 ║    234 ║
╚════════╩═══════════╩══════════╩══════════╩════════╝

帮忙吗?

可以这样写:

;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(ORDER BY tblUser.ID DESC)+1 AS rowNbr,
        tblUser.*
    FROM
        tblUser
    WHERE NOT tblUser.Id=1
)
UPDATE CTE 
SET Birthday = rowNbr

最新更新