一尘不染

获取随机记录的行数

sql

对于像这样的简单SQL,

SELECT top 3 MyId FROM MyTable ORDER BY NEWID()

如何将行号添加到它们,以使行号变为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

上面的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

所以,请帮忙。

注:这是不是关于MySQL BYT T-SQL作为它们的语法是不同的,因此该解决方案是不同的,以及。


阅读 128

收藏
2021-05-23

共1个答案

一尘不染

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

SELECT Row_number()OVER(ORDER BY (SELECT NULL)),*
FROM   (SELECT TOP 3 MyId
        FROM   MyTable
        ORDER  BY Newid()) a 

在逻辑上,TOP关键字在之后处理Select。在生成行号后,将随机提取3条记录。因此,您不应在原始查询中生成行号

更新

这可以通过实现CROSS APPLY。用表中的where有效列名替换cross apply子句中的列名Person

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 
2021-05-23