以随机顺序选择行,然后反转它

时间:2011-01-09 15:29:51

标签: sql-server-2005

我需要以随机顺序选择行并返回一个查询,该查询以常规顺序和相反顺序保存行。这是为了模拟我正在进行的篮球比赛的幻想选秀。

例如,我需要一个结果集如下:

team1 1
team2 2
team6 3
team9 4
team9 5
team6 6
team2 7
team1 8

正如您所看到的,前四个队伍是随机的,然后是四个队伍是相反的顺序。 希望我设法解释这个问题,如果没有 - 请评论,我会进一步解释。

2 个答案:

答案 0 :(得分:2)

您必须“缓存”随机ORDER BY的结果。

在此代码中,如果您在UNION中引用CTE,它将被评估两次,您将有2个不同的订单。 CTE只是一个宏

;WITH cList AS
(
SELECT team, ROW_NUMBER() OVER (ORDER BY NEWID()) AS rn
FROM teams
)
SELECT * INTO #tempresults FROM cList WHERE rn <= @rn --or however many

SELECT *, rn FROM #tempresults
UNION ALL
SELECT *, (2 * @rn) - rn FROM #tempresults
ORDER BY rn

使用虚拟交叉连接(like this)可以轻松复制行,但这需要对中间结果进行排序和rownumbering。我不认为它可以在单个SQL语句中完成

答案 1 :(得分:1)

你可以使用这样的查询:

select top(10) teamname, NewId() as Random
from teams
order by Random

这将返回数据库中排名前十的随机团队。然后你可以用一些代码来反转它。