SQL设置递增整数,其中列的值为1

时间:2018-09-17 13:59:23

标签: sql sql-server tsql

我有一个看起来像这样的数据集:

Id INT,
Choice VARCHAR,
Order INT

Id + Choice构成主键。

当前很多行的Order = 1。

我想做的是,对于每个Id,如果有多个带有该Id的行,其中Order = 1,请将它们设置为1,2,3,4,等

我无法计算出要执行此操作的SQL。

示例数据:

+----+--------+-------+
| Id | Choice | Order |
+----+--------+-------+
|  4 | hello  |     1 |
|  4 | world  |     1 |
|  4 | test   |     1 |
+----+--------+-------+

将成为:

+----+--------+-------+
| Id | Choice | Order |
+----+--------+-------+
|  4 | hello  |     1 |
|  4 | world  |     2 |
|  4 | test   |     3 |
+----+--------+-------+

1 个答案:

答案 0 :(得分:4)

我们可以在此处尝试将ROW_NUMBERId进行分区。至于您的Order列中的排序,我看不出任何有关如何编号的逻辑。如果没有这种方法,我将使用Choice列来决定如何对行编号进行排序。

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Choice) rn
    FROM yourTable
    WHERE [Order] = 1
)

UPDATE cte
SET [Order] = rn;

注意:请避免使用保留的SQL关键字(例如ORDER)命名列(表等)。您将永远不得不将该列名称放在方括号中,例如:[Order]