获取 ROW NUMBER 条随机记录

xpt*_*xpt 0 sql t-sql sql-server

对于像这样的简单 SQL,

SELECT top 3 MyId FROM MyTable ORDER BY NEWID()
Run Code Online (Sandbox Code Playgroud)

如何向它们添加行号,使行号变为1,2,3?

更新:

我以为我可以像上面那样简化我的问题,但事实证明它更复杂。所以这里是一个更完整的版本——我需要MyTable为每个人提供三个随机选择(来自 ),选择/行号为 1、2 和 3,并且人和选择之间没有逻辑连接。

SELECT * FROM Person
LEFT JOIN (
  SELECT top 3 MyId FROM MyTable ORDER BY NEWID()
) D ON 1=1
Run Code Online (Sandbox Code Playgroud)

上述 SQL 的问题是,

  • 显然,应该添加1、2、3的选/行号
  • 不明显的是,上面的 SQL 会给每个人相同选择,而我需要给不同的人不同的选择

下面是一个用于测试它的有效 SQL:

SELECT TOP 15 database_id, create_date, cs.name FROM sys.databases
CROSS apply ( 
  SELECT top 3 Row_number()OVER(ORDER BY (SELECT NULL)) AS RowNo,*
  FROM (SELECT top 3 name from sys.all_views ORDER BY NEWID()) T
  ) cs
Run Code Online (Sandbox Code Playgroud)

所以,请帮忙。

注意:这与 MySQL byt-SQL 无关,因为它们的语法不同因此解决方案也不同

Pரத*_*ீப் 5

添加Row_number到外部查询。尝试这个

SELECT Row_number()OVER(ORDER BY (SELECT NULL)),*
FROM   (SELECT TOP 3 MyId
        FROM   MyTable
        ORDER  BY Newid()) a 
Run Code Online (Sandbox Code Playgroud)

逻辑上TOP关键字是在 后处理的Select。生成行号后,将随机抽取 3 条记录。所以你不应该在原始查询中生成行号

更新

可以通过 来实现CROSS APPLY。将交叉应用子句中的列名替换wherePerson表中的有效列名

SELECT *
FROM   Person p
       CROSS apply (SELECT Row_number()OVER(ORDER BY (SELECT NULL)) rn,*
                    FROM   (SELECT TOP 3 MyId
                            FROM   MyTable
                            WHERE  p.some_col = p.some_col -- Replace it with some column from person table
                            ORDER  BY Newid())a) cs 
Run Code Online (Sandbox Code Playgroud)