【问题标题】:Assign a unique number in a range randomly随机分配一个范围内的唯一编号
【发布时间】:2012-08-25 06:58:46
【问题描述】:

我需要为员工列表分配一个从 1 到 1000 的唯一编号(或者无论有多少员工)。这些数字不能重复,并且需要按照员工列表的随机顺序排列。这些号码也需要每周重新生成,以便为员工分配一个新号码。

我尝试使用以下脚本,但是脚本速度很慢,并且它为所有员工返回相同的数字。

DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT

SET @Lower = 1 
SET @Upper = 1000 
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
select personnum, firstnm, lastnm, (SELECT @Random)
from person

任何人都可以阐明如何做到这一点吗? 谢谢

【问题讨论】:

  • 为什么需要随机排序?
  • 随机顺序是这样的,员工每周可以被排序和分配有限的班次,没有任何偏袒。
  • @Withdal​​ot 。 . .对于这个问题,你可以考虑“ORDER BY newid()”
  • 谢谢 Gordon,但我仍然需要一个应用程序可以用来排序和选择员工的编号。
  • 是否要求没有员工连续两周赢得相同的号码?

标签: sql tsql random range unique


【解决方案1】:

适用于 mssql server 2005+

select personnum, firstnm, lastnm, row_number() over (order by newid()) randomnumber
from person

【讨论】:

  • 这太完美了!非常感谢。
【解决方案2】:

为它创建一个函数。这是我们使用的一个:

ALTER FUNCTION [dbo].[fn_GenerateUniqueNumber]()
RETURNS char(10)

AS 
BEGIN
    --DECLARE VARIABLES
    DECLARE @RandomNumber VARCHAR(10)
    DECLARE @I SMALLINT
    DECLARE @RandNumber FLOAT
    DECLARE @Position TINYINT
    DECLARE @ExtractedCharacter VARCHAR(1)
    DECLARE @ValidCharacters VARCHAR(255)
    DECLARE @VCLength INT
    DECLARE @Length INT

    --SET VARIABLES VALUE
    SET @ValidCharacters = '0123456789'   
    SET @VCLength = LEN(@ValidCharacters)
    SET @ExtractedCharacter = ''
    SET @RandNumber = 0
    SET @Position = 0
    SET @RandomNumber = ''
    SET @Length = 10
    SET @I = 1

    WHILE @I < ( @Length + 1 )
        BEGIN
            SET @RandNumber = (SELECT RandNumber FROM [RandNumberView])
            SET @Position = CONVERT(TINYINT, ( ( @VCLength - 1 ) * @RandNumber + 1 ))
            SELECT  @ExtractedCharacter = SUBSTRING(@ValidCharacters, @Position, 1)
            SET @I = @I + 1
            SET @RandomNumber = @RandomNumber + @ExtractedCharacter
        END

    RETURN @RandomNumber
END

要使用它,请执行以下操作:

SELECT personnum, firstnm, lastnm,dbo.fn_GenerateUniqueNumber()
FROM person

您可以修改参数和允许的值,以确保它是您想要的数字类型。

【讨论】:

  • 这就是为什么我以“您可以修改参数和允许的值”结尾的原因。您只需要删除非数字。这是一个非常灵活的功能。
  • 有没有办法将它添加到 select 语句中,因为这将通过不支持该功能的简单中间件运行?
  • 我想我应该问一下你在哪里运行它。你没有具体说明。我相信@t-clausen.dk 方法会起作用。
猜你喜欢
  • 2018-03-08
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 2011-05-16
  • 1970-01-01
  • 2014-05-15
相关资源
最近更新 更多