【问题标题】:pick random and unique items SQL选择随机和独特的项目 SQL
【发布时间】:2019-12-02 14:24:33
【问题描述】:

我们正在尝试使用 1-37 之间的随机(和 unqiue)值填充表。但是,以下查询不是唯一的。

truncate table [dbo].[webscrape]
declare @date date = '1990-01-01',
@endDate date = Getdate()

while @date<=@enddate
begin
insert into [dbo].[webscrape](date,value1,value2,value3,value4,value5)
SELECT @date date,convert(int,(RAND()*37-1+1)) value1,
convert(int,(RAND()*37-1+1)) value2,
convert(int,(RAND()*37-1+1)) value3,
convert(int,(RAND()*37-1+1)) value4,
convert(int,(RAND()*37-1+1)) value5

set @date = DATEADD(day,1,@date)
end

【问题讨论】:

标签: sql sql-server random unique


【解决方案1】:

如果value1value2value3value4value5 必须是来自 [1..37] 的 5 个唯一随机值,那么下面的 insert 可能会起作用:

;with ThirtySeven as (
    SELECT 1 As RowNum
    UNION ALL
    SELECT RowNum+1
        FROM ThirtySeven
        WHERE RowNum<37
), Randoms37 AS (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY [RowNum]) as RowNum,
        ROW_NUMBER() OVER (ORDER BY NEWID()) as Random
    FROM ThirtySeven
)
insert into [dbo].[webscrape](date,value1,value2,value3,value4,value5)
SELECT @date date, [1], [2], [3], [4], [5] 
from (select Random, RowNum from randoms37 where RowNum<=5) rnd37 
    pivot (min(random) FOR RowNum in ([1], [2], [3], [4], [5])) as rnd37

【讨论】:

    【解决方案2】:

    主要点是具有可用值的创建表,并采用拾取的值 - 选择值,从可用中删除并添加到拣选。

    declare @initData table (ID int)
    declare @pickedData table (ID int)
    declare @i  int =0;
    declare @pickAmount int = 7;
    declare @pickedIndex int = 0;
    declare @pickedValue int = 0;
    set @i = 0;
    while @i<37
    begin
    set @i = @i+1;
    insert into @initData VALUES (@i)
    end
    while (select count(ID) from @pickedData) < @pickAmount
    begin
     set @pickedIndex = convert(int,(RAND()*(select count(ID)-1 from @initData)))
     select @pickedValue=id from @initData order by id  OFFSET (@pickedIndex) ROWS FETCH NEXT (1) ROWS ONLY 
     insert into @pickedData VALUES (@pickedValue)
     delete from @initData where id = @pickedValue;
    end
    select * from @pickedData;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 2011-04-13
      • 2020-04-25
      • 2020-07-01
      • 1970-01-01
      相关资源
      最近更新 更多