Sql 按NEWID()的顺序生成随机测试数据,包括重复的行

Sql 按NEWID()的顺序生成随机测试数据,包括重复的行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要从表中为测试数据选择随机行。有时我需要的测试数据行可能比表中的记录多。复制品可以。如何构造select以获得重复的行 CREATE TABLE [Northwind].[dbo].[Persons] (PersonID int, LastName varchar(255)) INSERT INTO [Northwind].[dbo].[Persons] VALUES (1, 'Smith'), (2, 'Jones'), (3, 'Washington') SELECT TOP 5

我需要从表中为测试数据选择随机行。有时我需要的测试数据行可能比表中的记录多。复制品可以。如何构造select以获得重复的行

CREATE TABLE [Northwind].[dbo].[Persons]
(PersonID int, LastName varchar(255))

INSERT INTO [Northwind].[dbo].[Persons] 
VALUES
(1, 'Smith'), 
(2, 'Jones'),
(3, 'Washington')

SELECT TOP 5 *
FROM [Northwind].[dbo].[Persons]  
ORDER BY NEWID()
如何让Select语句以随机顺序给我五条记录,并重复?目前,它仅以随机顺序返回三个


我希望能够扩展此功能,以获得100行或1000行或我需要的任意多行。

使用递归CTE合并足够多的行,以便它们比您想要的大。然后像以前一样从中选择

declare
    @desired int = 5,
    @actual int = (select count(*) from persons);

with

    persons as (

        select    personId,
                  lastName,
                  batch = 0
        from      Persons

        union all
        select    personId,
                  lastName,
                  batch = batch + 1
        from      persons
        where     (batch + 1) * @actual < @desired

    )

    select    
    top (@desired) personId, lastName
    from           persons
    order by       newid()

如前所述。你可以给我们一个理货表,然后得到随机的行

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)))N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1, N N2, N N3, N N4) --Repeat for more
SELECT TOP 500 YT.*
FROM Tally T
     CROSS JOIN YourTable YT
ORDER BY NEWID();

我在想,如果不订购所有记录,尤其是多次订购,您将如何解决此问题

一种方法是生成随机数,并使用这些随机数查找数据中的值:

with n as (
      select rand(checksum(newid())) as r, 1 as n
      union all
      select rand(checksum(newid())) as r, n + 1
      from n
      where n < 10
     ),
     tt as (
      select t.*, lag(tile_end, 1, 0) over (order by tile_end) as tile_start
      from (select t.*, row_number() over (order by newid()) * 1.0 / count(*) over () as tile_end
            from t
           ) t
     )
select tt.*, n.r, (select count(*) from n)
from n left join
     tt
     on n.r >= tt.tile_start and n.r < tt.tile_end;
他是一把小提琴。行号不需要使用order by newid。它可以通过一个具有索引的键进行排序,这使得该组件更加高效


对于100多行,您将需要选项MAXRECURSION 0。

我添加了一个临时结果表,并循环查询并将结果推送到临时表中

declare  @results table(
SSN varchar(10),
Cusip   varchar(10),
...
EndBillingDate  varchar(10))

DECLARE @cnt INT = 0;

WHILE @cnt < @trades
BEGIN
INSERT INTO @results 
   Select   ...

 set @cnt = @cnt + 10
END

select * from @results

这里有几种解决方案。它们都有点奇怪,因为在关系数据世界中,您试图做的事情相当奇怪。您可以使用另一个具有更多行的表并连接到您的表,基本上创建笛卡尔坐标系。您可以使用交叉连接将表连接到自身。但是,无论您如何分割它,最终可能会有一些行被复制,而一些行根本没有返回。是否有这样的要求:只有在没有足够的行来管理它而没有复制的情况下,才应该返回重复的行?复制行而不返回一些行是可以的。我希望能够扩展它,得到100行或1000行,或者我需要多少行;然后只选择…中的前5个,这里有一些答案。记住,如果其中任何一个符合您的需要,请将其标记为已接受。