基于date和int的SQL Randomise行仅每天更改结果顺序

时间:2013-05-27 01:48:29

标签: sql sql-server tsqlt

我想为select语句返回的每一行生成一个“随机”整数,其中random int每天只更改一次(凌晨4点之前和之后)。

示例

declare @Date datetime

set @Date = dateadd(dd, 8, GETDATE())

declare @DateNumber int

set @DateNumber = LEFT(CONVERT(VARCHAR(8), @Date, 112),10) 
+ cast(CASE WHEN DATEPART(hh, @Date) > 4 THEN 1 ELSE 0 END as varchar(1))

declare @Customers table (Id int, Customer varchar(150), OrderNo int)

insert into @Customers (Id, Customer) values (1, 'Cust A'),  (2, 'Cust B'), 

(3,'Cust C'),(4,'Cust D'),(5,'Cust E'),(6,'Cust F'),     (7,'Cust G'),(8,'Cust H'),(9,'Cust I')

-- my 1st attempt which doesnt work

update @Customers set OrderNo = rand(@DateNumber) / rand(Id) * 100

select * from 
@Customers order by OrderNo 

结果的顺序应该保持不变,直到我在顶部的set @Date语句中更改dd值。

有什么想法吗?这可能吗? (除了通过SQL工作每天计算)


使用HABO的推荐更新解决方案

declare @Date datetime = dateadd(hh, 36, GETDATE())

declare @DateNumber int = LEFT(CONVERT(VARCHAR(8), @Date, 112),10) + 
cast(CASE WHEN DATEPART(hh, @Date) > 4 THEN 1 ELSE 0 END as varchar(1))

declare @Customers table (Id int, Customer varchar(150), OrderNo int)

insert into @Customers (Id, Customer) values (1, 'Cust A'),  (2, 'Cust B'), 
(3, 'Cust C'), (4, 'Cust D'), (5, 'Cust E'), (6, 'Cust F'), 
(7, 'Cust G'), (8, 'Cust H'), (9, 'Cust I')

declare @ThrowAway as Float = Rand(@DateNumber)

declare @ID int

set @ID = (select min(ID) from @Customers)

while @ID is not null

begin

    update @Customers set OrderNo = Floor(Rand() * 100) + 1 where ID = @ID


    set @ID = (select min(ID) from @Customers where ID > @ID) 

end 


select * from @Customers order by OrderNo 

1 个答案:

答案 0 :(得分:1)

当您向RAND( Seed )提供种子时,它将返回相同的结果。如果您在UPDATE查询之前使用种子值,它将初始化序列。此后只需使用RAND()而无需参数。类似的东西:

declare @ThrowAway as Float = Rand( @DateNumber )
update @Customers
  set OrderNo = Floor( Rand() * 100 ) + 1

请记住,随机值包含重复项。