我有一个看起来像这样的数据集:
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 |
+----+--------+-------+
答案 0 :(得分:4)
我们可以在此处尝试将ROW_NUMBER
与Id
进行分区。至于您的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]
。