得到ROW NUMBER个随机记录

时间:2016-12-07 16:25:16

标签: sql sql-server tsql

对于简单的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

所以,请帮忙。

注意:这是 NOT 关于MySQL的T-SQL,因为它们的语法不同,因此解决方案不同< / em>以及。

1 个答案:

答案 0 :(得分:2)

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来实现。将cross apply where子句中的列名替换为Person table

中的有效列名
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