为表格中的每个唯一值添加随机ID

时间:2019-09-04 17:44:30

标签: sql sql-server

我的桌子像

ID      RANDOM_ID
1       123
10      456
25      789
1       1112
55      1314
10      1516

我希望结果像这样:

ID      RANDOM_ID
1       123
10      456
25      789
1       123
55      1314
10      456

相同的ID应该具有相同的random_id。创建表后,我正在使用update语句生成Random_ID。

CREATE TABLE [RANDOMID_TABLE]([ID] [int]   NULL, [RANDOM_ID] [int]  NULL)
GO

INSERT INTO [RANDOMID_TABLE] ([ID])          
select distinct ABC_ID from RANDOMID_ABC
GO

 ******** This is the update statement for the RANDOM_ID column in 
 [RANDOMID_TABLE] table ************

UPDATE [RANDOMID_TABLE]
SET  RANDOM_ID = abs(checksum(NewId()) % 1000000)

我还需要添加到更新语句中吗?

请告知。

4 个答案:

答案 0 :(得分:1)

为什么要为此使用update?只需在插入它们时生成值即可:

insert into [RANDOMID_TABLE] (ID, RANDOM_ID)          
    select ABC_ID, abs(checksum(NewId()) % 1000000)
    from RANDOMID_ABC
    group by ABC_ID;

编辑:

如果您的问题是冲突,请确定如何进行分配。只需分配一个数字即可。 。 。随机:

insert into [RANDOMID_TABLE] (ID, RANDOM_ID)          
    select ABC_ID, row_number() over (order by newid())
    from RANDOMID_ABC
    group by ABC_ID;

保证不会返回重复项。

答案 1 :(得分:1)

总的来说,您是否只是想Always on该表,以便特定UPDATE的所有值对ID具有相同的值?这样吗?

Random_ID

答案 2 :(得分:0)

这是使用临时表所需的脚本(您需要它来保留每个唯一ID的随机结果):

DECLARE @Tbl TABLE (ID INT, RANDOM_ID INT)
INSERT @Tbl (Id) VALUES(1), (10), (25), (1), (55), (10)
SELECT Id, abs(checksum(NewId()) % 1000000) AS Random_Id INTO #distinctData FROM @Tbl GROUP BY Id
SELECT D.* FROM @Tbl T JOIN #distinctData D ON D.ID = T.ID
DROP TABLE #distinctData

很明显,您不需要在我创建和初始化数据表的前两行

结果:

Id  Random_Id
1   354317
1   62026
10  532304
10  604768
25  874209
55  718643

答案 3 :(得分:0)

您想要每个ID一个随机值。因此,人们应该认为以下方法会起作用:

#pragma comment(lib, "user32")

HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);

void fontsize(int a, int b) {

    PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx = new CONSOLE_FONT_INFOEX();
    lpConsoleCurrentFontEx->cbSize = sizeof(CONSOLE_FONT_INFOEX);
    GetCurrentConsoleFontEx(out, 0, lpConsoleCurrentFontEx);
    lpConsoleCurrentFontEx->dwFontSize.X = a;
    lpConsoleCurrentFontEx->dwFontSize.Y = b;
    SetCurrentConsoleFontEx(out, 0, lpConsoleCurrentFontEx);
}

void main() {


    fontsize(12, 16);
    cout << "text" << endl;


    system("pause");
}

但是不是。 SQL Server在这里有些问题,但仍然为相同的ID创建不同的数字。

因此,最好的选择可能是:执行确实会创建不同值的更新(您的原始更新语句)。然后按如下所示纠正数据:

with ids as 
(
  select distinct id 
  from randomid_table
)
, ids_with_rnd as 
(
  select id, abs(checksum(NewId()) % 1000000) as rnd
  from ids
)
update randomid_table
set random_id =
(
  select rnd
  from ids_with_rnd
  where ids_with_rnd.id = randomid_table.id
);

演示:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=504236db66fba0f12dc7e407a51451f8