我有一个包含新列的表,并更新应该在新列中的值。为简单起见,我正在减少我的示例表结构以及我的查询。以下是我希望输出显示的方式。
IDNumber NewColumn
1 1
2 1
3 1
4 2
5 2
WITH CTE_Split
AS
(
select
*,ntile(2) over (order by newid()) as Split
from TableA
)
Update a
set NewColumn = a.Split
from CTE_Split a
现在,当我这样做时,我得到了我的桌子,看起来就像这样
IDNumber NewColumn
1 1
2 1
3 1
4 1
5 1
然而,当我只选择时,我可以看到我得到了欲望输出,现在我已经完成了这个,将结果集分成多个组,并且所有内容都在select中工作但是现在我需要更新表我是得到这个奇怪的结果。不安静,确定我做错了什么,或者是否有人可以提供任何反馈。
所以经过一整天的挫折之后,我能够将这个代码和表格与另一个我已经完成此过程的表格进行比较。这个表被更新到所有1的原因是因为结果表明制作表的人认为这应该是一个标志。实际上它应该是一个int,因为在这种情况下它实际上只有两个可能的值,但在其他情况下它可能超过两个。 感谢您的所有建议和帮助,它应该教我在使用ntile函数时确定表的数据类型。
答案 0 :(得分:1)
尝试直接更新您的表,而不是更新您的CTE。这使您的UPDATE语句更清楚。
以下是一个例子:
WITH CTE_Split AS
(
SELECT
*,
ntile(2) over (order by newid()) as Split
FROM TableA
)
UPDATE a
SET NewColumn = c.Split
FROM
TableA a
INNER JOIN CTE_Split c ON a.IDNumber = c.IDNumber
我认为您要实现的目标是将记录分组为两个随机分区。这句话似乎可以胜任。